Spring Security使用自定义UserDetailsS​​ervice来存储自定义User对象

时间:2014-07-11 01:58:41

标签: spring jpa spring-security

我使用的是Spring security + JPA +自定义UserDetailsS​​ervice。好像我只能存储

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

在User对象中。如果我需要在登录后在会话中疼痛我的自定义User对象,该怎么办?我想保存FIRST,LAST,公司和...... 谢谢!

2 个答案:

答案 0 :(得分:3)

您可以定义自己的用户模型,并将所有首选属性添加到其中。然后将其包含在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)的托管实体

答案 1 :(得分:0)

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

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

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