我可以使用spring security将完整的用户信息存储在cookie中,记住我

时间:2012-09-05 09:09:12

标签: java cookies spring-security remember-me

我想将其他用户信息存储在像userId这样的cookie中,用户名和密码。当我使用spring security记住我的功能时,我可以从cookie中获取用户名。

在spring-security.xml中我使用自定义userDetailService,我已经像

那样实现了它
 <http>
 ......   
 <logout invalidate-session="true" 
        logout-success-url="/" 
        logout-url="/logout.htm"/>
 <remember-me user-service-ref="myUserDetailsService" key="89dqj219dn910lsAc12" token-validity-seconds="864000"/>
</http>

<authentication-manager>
        <authentication-provider user-service-ref="myUserDetailsService">
                <password-encoder ref="myEnocdePassword" >
                    <salt-source user-property="username"/>
                </password-encoder>
        </authentication-provider>
</authentication-manager>   
<beans:bean id="myEnocdePassword" class="com.mycom.myproject.utility.MyEnocdePassword" />

在MyUserDetailService.java中,我有类似

的代码
  @Override
public UserDetails loadUserByUsername(String username)
        throws UsernameNotFoundException, DataAccessException {

    try {

    boolean enabled = true;
    boolean accountNonExpired = true;
    boolean credentialsNonExpired = true;
    boolean accountNonLocked = true;

    com.mycom.myproject.db.mybatis.model.User domainUser = userService.getUserByName(username);




    return  new User(
            domainUser.getUsername(), 
            domainUser.getPassword(),
            enabled,
            accountNonExpired,
            credentialsNonExpired,
            accountNonLocked,
            getAuthorities(domainUser.getRoleId);

    } catch (Exception e) {
        throw new RuntimeException(e);
    }

在我的控制器类中,我可以使用

获取用户名
   String name = SecurityContextHolder.getContext().getAuthentication()
            .getName();

但我想将其他用户详细信息存储在像userId这样的cookie中。我怎么能这样做?我是否需要通过userDao(名称)获取用户信息,然后手动将用户信息存储在cookie中?

2 个答案:

答案 0 :(得分:3)

在这种情况下,您无需对Cookie执行任何操作。

只要用户登录(无论他如何登录 - 使用登录表单或“记住我”),您都可以从UserDetails访问该用户的SecurityContext,Spring Security会照顾它的。

因此,您只需要将所需信息放入UserDetails中的UserDetailsService.loadUserByUsername()(如有必要,请使用您自己的UserDetails子类),然后通过{{1}访问它}:

SecurityContext

换句话说,当Spring Security收到没有活动会话的请求但记住了我的cookie时,它会使用cookie中的用户身份加载Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null) { Object principal = auth.getPrincipal(); if (principal instanceof UserDetails) { UserDetails user = (UserDetails) principal; ... // User is logged in, now you can access its details } } 并将它们放入UserDetails(并进入新创建的)会话会议)。稍后您可以从SecurityContext

访问这些详细信息

答案 1 :(得分:0)

通常已有Cookie! 您可以将值存储在会话中。

如果您想长时间存储这些值,可以使用Session-Passivation。