gpt4 book ai didi

spring - 为什么 Spring 安全性基于用户名而不是用户 ID?

转载 作者:行者123 更新时间:2023-12-04 01:59:34 25 4
gpt4 key购买 nike

在 Spring Security 中,UserDetails 使用用户名作为用户的标识符。我的用户模型有多种类型的标识和多种身份验证方式(通过电子邮件、电话号码、Facebook 等)。

我正在使用 AuthorizationServerEndpointsConfigurer配置我的 oauth2 端点。 JdbcTokenStore专卖店user_name在数据库中,我需要存储的是userId .我已经更改了 JdbcTokenStore满足我的需求,但我不明白为什么spring框架假设用户名是唯一标识符,我的应用程序甚至不使用用户名。

例如,在 TokenStore接口(interface) findTokensByClientIdAndUserName基于用户名,为什么不 findTokensByClientIdAndUserId ?如果我使用电子邮件或电话号码对用户进行身份验证,如何获取该用户的所有 token ?

我的用户模型示例:id , email , phone number , facebook_id , name .电子邮件、电话号码和 facebook id 是可选的,只需要其中之一。在这种情况下,用户名的最佳候选者是什么?我应该在 spring 抽象方式中使用用户 ID 作为用户名吗?

最佳答案

不确定我是否理解了整个问题,但会尽力为 UserDetailService 提供最好的解释。 UserDetailsS​​ervice 的方法 loadByUsername 只是一种允许您从数据库中检索用户并将其与来自客户端请求的凭据进行比较以查看它是现有用户还是不存在用户的方法。尽管该方法的名称是 loadUserByUsername,但这并不意味着您必须按字面意思传递用户名,您可以将任何参数传递给它,例如电子邮件、电话号码或您的身份验证所基于的任何参数。

这是该服务的示例实现,我通过 UserRepository 调用数据库并将其作为参数电子邮件提供来识别我的用户。

@Service
public class CustomUserDetailsService implements UserDetailsService {

private UserRepository userRepository;

@Autowired
public CustomUserDetailsService(UserRepository userRepository) {
this.userRepository = userRepository;
}

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
// Here I am retrieving the user from my database where the primary key is
// email
User user = userRepository.findByEmail(username);

if(user == null) {
throw new UsernameNotFoundException("Username not found!");
}

CustomUserDetails customUserDetails = new CustomUserDetails(user);
return customUserDetails;
}
}

关于spring - 为什么 Spring 安全性基于用户名而不是用户 ID?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48268945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com