【问题标题】:Why Spring security is based in username instead of user id?为什么 Spring 安全性基于用户名而不是用户 ID?
【发布时间】:2018-06-24 10:27:07
【问题描述】:

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

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

例如,在TokenStore 中推断findTokensByClientIdAndUserName 是基于用户名的,为什么不是findTokensByClientIdAndUserId?如果我使用电子邮件或电话号码对用户进行身份验证,如何获取该用户的所有令牌?

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

【问题讨论】:

    标签: spring spring-boot spring-security spring-oauth2


    【解决方案1】:

    不确定我是否理解了整个问题,但会尽力为 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;
        }
    }
    

    【讨论】:

    • 对不起,我的问题不是很明确。我已经编辑过了。我希望你现在能更好地理解它。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-09
    • 1970-01-01
    相关资源
    最近更新 更多