1. 程式人生 > >springsecurity的remember me

springsecurity的remember me

ice style series 如果 數據庫 pro blog 代碼 table

基於持久化的token的方法

實現原理:將生成的 token 存入 cookie 中並發送到客戶端瀏覽器,待到下次用戶訪問系統時,系統將直接從客戶端 cookie 中讀取 token 進行認證。

實現過程:

  1. 用戶選擇了 “記住我” 成功登錄後,將會把 username、隨機產生的序列號、生成的 token 存入一個數據庫表中,同時將它們的組合生成一個 cookie 發送給客戶端瀏覽器。
  2. 當下一次沒有登錄的用戶訪問系統時,首先檢查 cookie,如果對應 cookie 中包含的 username、序列號和 token 與數據庫中保存的一致,則表示其通過驗證,系統將重新生成一個新的 token 替換數據庫中對應組合的舊 token
    ,序列號保持不變,同時刪除舊的 cookie,重新生成包含新生成的 token,就的序列號和 username 的 cookie 發送給客戶端。
  3. 如果檢查 cookie 時,cookie 中包含的 username 和序列號跟數據庫中保存的匹配,但是 token 不匹配。這種情況極有可能是因為你的 cookie 被人盜用了,由於盜用者使用你原本通過認證的 cookie 進行登錄了導致舊的 token 失效,而產生了新的 token。這個時候 Spring Security 就可以發現 cookie 被盜用的情況,它將刪除數據庫中與當前用戶相關的所有 token 記錄,這樣盜用者使用原有的 cookie 將不能再登錄,同時提醒用戶其帳號有被盜用的可能性。
  4. 如果對應 cookie 不存在,或者包含的 username 和序列號與數據庫中保存的不一致,那麽將會引導用戶到登錄頁面。

2:使用持久化的token,必須在專門建立一張數據表:

1 create table persistent_logins (username varchar(64) not null,
2                                     series varchar(64) primary key,
3                                     token varchar(64) not null,
4                                     last_used timestamp not null
)

通過 remember-me 元素來使用,只是這個時候我們需要其 data-source-ref 屬性指定對應的數據源,且需要指明使用哪個user-service-ref="userDetailsService",如果沒有配置專門的userDetailsService,將會使用默認的userDetailsService

需要增加的配置有:

在<http>節點加入下列一行代碼

1 <security:remember-me key="elim" user-service-ref="userDetailsService" data-source-ref="dataSource"/>

配置userDetailsService

<bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
        <property name="dataSource" ref="dataSource"/>
    </bean>

在登陸界面需要加一行代碼:

1  <input  name="_spring_security_remember_me" type="checkbox" value="true"/>
2                      記住密碼

name必須為_spring_security_remember_me

在登陸頁面上選擇記住密碼登陸成功以後

查看cookie

技術分享





springsecurity的remember me