【问题标题】:Spring Security use custom UserDetailsService to store custom User objectSpring Security 使用自定义 UserDetailsS​​ervice 来存储自定义 User 对象
【发布时间】:2014-09-01 13:36:49
【问题描述】:

我正在使用 Spring 安全性 + JPA + 自定义 UserDetailsS​​ervice。好像只能存了

String username, String password, boolean enabled, boolean accountNonExpired,
            boolean credentialsNonExpired, boolean accountNonLocked, Collection<? extends GrantedAuthority> authorities

在用户对象中。如果我需要在登录后在会话中弄痛我的自定义用户对象,我该怎么办。我想保存 FIRST、LAST、Company 和... 谢谢!

【问题讨论】:

    标签: spring jpa spring-security


    【解决方案1】:

    您可以定义自己的用户模型,并为其添加所有首选属性。然后将其包装在您的 UserDetails 实现中,例如

    public class UserModel {
       private username;
       private password;
       private firstname;
       private lastname;
       .
       .
       .
       etc
    }
    
    public class MyUserDetails implements UserDetails {
    
      private UserModel user;
    
      public UserModel getUser(){
        return user;
      }
    
      @Override
      public String getUsername(){
        return user.getUsername();
      }
    
      @Override
      public String getPassword(){
        return user.getPassword();
      }
    
    }
    

    当您需要访问您的UserModel 特定属性时,请使用getUser() 方法并直接访问您的特定字段

    MyUserDetails myUserDetails = (MyUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
    
    UserModel user = myUserDetails.getUser();
    
    String firstname = user.getFirstname();
    

    这种实现的好处是您将安全性UserDetails 实现与您自己的User 实现分开,后者可以是任何ORM 框架(如Hibernate)的托管实体

    【讨论】:

    • 请问这个 userDetails 是干什么用的?我什么时候想使用 userDetailsS​​ervice 及其 userDetails ?什么用例?在哪种情况下?我已经为我的 REST 应用程序实现了一个完全有效的基本身份验证,并且想知道是否/如何/为什么我应该在组合中添加 userDetails。
    • 我想我的问题得到了答案。我使用扩展 UserDetails 的自定义 UserDetailsWrapper 实现了一个自定义 UserDetailsS​​erviceImpl 扩展 UserDetailsS​​ervice 并在安全配置中使用它和 http.userDetailsS​​ervice(userDetailsS​​ervice);这允许在授予访问权限之前考虑我的用户状态。例如。如果用户缺少角色,那么他将被拒绝授权。
    【解决方案2】:

    那里有一些很棒的教程,但如果你想使用 github 示例的捷径,请查看这个问题。

    Could not autowire field: private org.springframework.security.core.userdetails.UserDetailsService

    它还有一个 github 代表,您可以访问以获取示例代码,它是与 Sprin Sec 开发负责人合作完成的。

    【讨论】:

      猜你喜欢
      • 2014-10-12
      • 1970-01-01
      • 2013-02-11
      • 2012-12-13
      • 2013-06-30
      • 2013-05-12
      • 1970-01-01
      • 2014-10-06
      • 2016-03-09
      相关资源
      最近更新 更多