如何在没有用户名的情况下正确实现 UserDetailsService?
How to correctly implement the UserDetailsService without having an username?
我正在 spring-boot 中创建一个 oauth 服务,并希望使用 MariaDB 中的用户信息进行身份验证。
实施 UserDetailsService 时,我必须重写函数 loadUserByUsername。问题是我的用户模型没有字段用户名,而不是我想使用他们的邮件地址加载用户。
所以我的问题是:如何在没有用户名的情况下正确实施 UserDetailsService?
选项 1 可以是您必须在用户名和字段中传递 emailId 并使用 emailId 在您的自定义 UserDetailsService 中进行验证
选项 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;
}
}
那么邮件地址就是用户名
它只是一个 文本值,可以唯一标识用户 与域。它可以是:
- 登录名(域:应用程序)
- 电子邮件地址(域:全球)
- SSN (域:美国居民)
- 学号(域名:学校)
- 员工编号(域:公司)
- 玩家 ID (域:游戏站点)
- 或任何你想要的
只要是唯一的,loadUserByUsername
就可以恰好找到一条记录。
我正在 spring-boot 中创建一个 oauth 服务,并希望使用 MariaDB 中的用户信息进行身份验证。 实施 UserDetailsService 时,我必须重写函数 loadUserByUsername。问题是我的用户模型没有字段用户名,而不是我想使用他们的邮件地址加载用户。 所以我的问题是:如何在没有用户名的情况下正确实施 UserDetailsService?
选项 1 可以是您必须在用户名和字段中传递 emailId 并使用 emailId 在您的自定义 UserDetailsService 中进行验证
选项 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;
}
}
那么邮件地址就是用户名
它只是一个 文本值,可以唯一标识用户 与域。它可以是:
- 登录名(域:应用程序)
- 电子邮件地址(域:全球)
- SSN (域:美国居民)
- 学号(域名:学校)
- 员工编号(域:公司)
- 玩家 ID (域:游戏站点)
- 或任何你想要的
只要是唯一的,loadUserByUsername
就可以恰好找到一条记录。