1

我想将其他用户信息存储在 cookie 中,例如带有用户名和密码的 userId。当我使用弹簧安全记住我功能时,我可以从 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(name) 获取用户信息,然后手动将用户信息存储在 cookie 中?

4

2 回答 2

3

在这种情况下,您不需要对 cookie 做任何事情。

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

因此,您只需将所需信息放入UserDetails(如有必要,UserDetailsService.loadUserByUsername()使用您自己的子类UserDetails),并通过以下方式访问它SecurityContext

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
    }
}

换句话说,当 Spring Security 收到一个没有活动会话但带有记住我 cookie 的请求时,它使用来自 cookie 的用户身份来加载UserDetails并将它们放入SecurityContext(并放入新创建的会话会话中)。稍后您可以从 访问这些详细信息 SecurityContext

于 2012-09-05T11:41:21.567 回答
0

通常已经有一个 Cookie!您可以将值存储在 Session 中。

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

于 2012-09-05T09:49:03.557 回答