如何在没有用户名的情况下正确实现UserDetailsS​​ervice?

时间:2020-01-11 18:51:43

标签: java spring spring-boot oauth userdetailsservice

我正在spring-boot中创建oauth服务,并希望使用MariaDB中的用户信息进行身份验证。 在实现UserDetailsS​​ervice时,我必须重写功能loadUserByUsername。问题是我的用户模型没有字段用户名,而是我想使用他们的邮件地址来加载用户。 所以我的问题是:如何在没有用户名的情况下正确实现UserDetailsS​​ervice?

2 个答案:

答案 0 :(得分:1)

然后,邮件地址用户名。

这只是一个文本值,用于通过域唯一标识用户。可以是:

  • 登录名(域:应用程序)
  • 电子邮件地址(域:全局)
  • SSN (域:美国居民)
  • 学生证(域:学校)
  • 员工编号(域:公司)
  • 玩家ID (域:游戏网站)
  • 或任何您想成为的人

只要它是唯一的,以便loadUserByUsername可以找到一条记录。

答案 1 :(得分:0)

选项1可能是您必须在用户名和字段中传递emailId并使用emailId在自定义UserDetailsS​​ervice中进行验证

选项2,您需要进行一些映射,您可以使用这些映射从用户名字段中获取emailId。

@Component
public class AppUserDetailsService implements UserDetailsService{


    @Override
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
        User user = userRepository.findByEmailId(s.toLowerCase());
        if(user == null) {
            throw new UsernameNotFoundException(String.format("The username %s doesn't exist", s));
        }

        List<GrantedAuthority> authorities = new ArrayList<>();
        authorities.add(new SimpleGrantedAuthority("STANDARD_USER"));

        UserDetails userDetails = new org.springframework.security.core.userdetails.User(user.getEmailId(), user.getPassword(), authorities);

        return userDetails;
    }
}
相关问题