Spring Seucrity 之 Remember Me

Spring Security 提供了Remember-me機制用來實現記錄用戶的登陸狀態。方便用戶下 html

次自動登陸。Spring Security 對此操做提供了必要的鉤子,remember-me有兩個固定的實現 java

一個是使用把用戶登陸信息加密以cookie的方式保存到客戶端。一是用戶能夠把用戶信息 web

持久化到服務端的數據庫中。 spring

   注意:這兩種實現都必須有一個 UserDetailsService實現。若是你使用一個沒有使用 sql

UserDetailsService的驗證提供者,Remember-me將不會工做,除非你在應用的上下文中 數據庫

有一個UserDetailsService對象。 安全

1、基本的Hash保存到客戶端的Cookie中。 服務器

     直接在命名空間<http>中加入<remember-me />元素,就能夠使用本方法。但要注意的 cookie

是在你的。此時系統會自動爲你生成UserDetailsService對象(若是你在配置文件中定義了此 app

對象必須在<remember-me />使用user-service-ref指定)。本策略使用的爲

[java]  view plain copy
  1. org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices  

此策略會在客戶端生成一個名稱爲SPRING_SECURITY_REMEMBER_ME_COOKIE,值進

行加密後的Cookie

2、持久化到服務器端的服務器中

     若是想使用本策略,你須要在命名空間的配置中提供一個datasource引用:

 

[html]  view plain copy
  1. <http>  
  2.     ....  
  3.    <remember-me data-source-ref="someDataSource" />  
  4.  </http>  

數據庫中還必須包含一個名爲persistent_logins的表,表結構使用一下SQL語句建立(或者是等價的)

  
[sql]  view plain copy
  1. create table persistent_logins (  
  2.   username varchar(64) not null,  
  3.   series varchar(64) primary key,  
  4.   token varchar(64) not null,  
  5.   last_used timestamp not null)  


   因爲以上兩種策略對應的實現類都的父類(org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices)實現了LogoutHandler接口。

   在AbstractRememberMeServices類中的 logout(...)方法中清楚了Cookie。以下所示:

         

[java]  view plain copy
  1. public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {  
  2.         if (logger.isDebugEnabled()) {  
  3.             logger.debug( "Logout of user "  
  4.                     + (authentication == null ? "Unknown" : authentication.getName()));  
  5.         }  
  6.         cancelCookie(request, response);  
  7.     }  
 ...
[java]  view plain copy
  1. /** 
  2.      * Sets a "cancel cookie" (with maxAge = 0) on the response to disable persistent logins. 
  3.      * 
  4.      * @param request 
  5.      * @param response 
  6.      */  
  7.     protected void cancelCookie(HttpServletRequest request, HttpServletResponse response) {  
  8.         logger.debug("Cancelling cookie");  
  9.         Cookie cookie = new Cookie(cookieName, null);  
  10.         cookie.setMaxAge(0);  
  11.         cookie.setPath(getCookiePath(request));  
  12.   
  13.         response.addCookie(cookie);  
  14.     }  

......

若是想在用戶安全退出後不刪除Cookie, 能夠本身實現類,實現類能夠繼承org.springframework.security.web.authentication.rememberme.PersistentTokenBasedRememberMeServices 或

 org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices。在自定義類中只重寫org.springframework.security.web.authentication.rememberme.AbstractRememberMeServices

類中的logout(...)方法便可。(可是這樣 就失去了安全退出的意義了。哈哈)

相關文章
相關標籤/搜索