2012-09-05 22 views
1

我想用其他用戶信息存儲在用戶名和密碼等userId cookies中。當我使用彈簧安全功能記住我的功能時,我可以從cookie中獲取用戶名。我可以使用彈簧安全保存cookie中的完整用戶信息記住我

在彈簧的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(); 

但我想存儲其他用戶的詳細信息在cookie中像userId。我該怎麼做?我是否需要通過userDao(名稱)獲取用戶信息,然後手動將用戶信息存儲在cookie中?

+1

只是...不。密碼有**沒有**的地方在cookie中來回發送。 – pap

+0

是的,但如果我必須存儲userId。 – user965884

+0

爲什麼你需要將它存儲在cookies中? – axtavt

回答

3

在這種情況下,您不需要對cookie做任何事情。

只要用戶登錄(無論他是如何登錄的 - 使用登錄表單或「記住我」),您可以從SecurityContext訪問該用戶的UserDetails,Spring Security負責處理該用戶。

因此,所有你需要的是把requred信息爲UserDetailsUserDetailsService.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 
    } 
} 

換句話說,當春安全性收到沒有活動會話的請求,但記住我的cookie,它使用cookie中的用戶身份加載UserDetails並將它們放入SecurityContext(以及新創建的會話會話)。稍後,您可以從SecurityContext訪問這些詳細信息。

+0

Hi Axtavt ,我想十次提高你的答案..你是偉大的人。非常感謝您的指導。 – user965884

0

通常已經有一個Cookie! 您可以將這些值存儲在會話中。

如果您想長時間存儲這些值,則可以使用會話鈍化。

+0

感謝Peter,請你解釋一下我可以如何使用Session-Passivation – user965884

相關問題