springsecurity的remember me
阿新 • • 發佈:2017-05-12
ice style series 如果 數據庫 pro blog 代碼 table
基於持久化的token的方法
實現原理:將生成的 token 存入 cookie 中並發送到客戶端瀏覽器,待到下次用戶訪問系統時,系統將直接從客戶端 cookie 中讀取 token 進行認證。
實現過程:
- 用戶選擇了 “記住我” 成功登錄後,將會把 username、隨機產生的序列號、生成的 token 存入一個數據庫表中,同時將它們的組合生成一個 cookie 發送給客戶端瀏覽器。
- 當下一次沒有登錄的用戶訪問系統時,首先檢查 cookie,如果對應 cookie 中包含的 username、序列號和 token 與數據庫中保存的一致,則表示其通過驗證,系統將重新生成一個新的 token 替換數據庫中對應組合的舊 token
- 如果檢查 cookie 時,cookie 中包含的 username 和序列號跟數據庫中保存的匹配,但是 token 不匹配。這種情況極有可能是因為你的 cookie 被人盜用了,由於盜用者使用你原本通過認證的 cookie 進行登錄了導致舊的 token 失效,而產生了新的 token。這個時候 Spring Security 就可以發現 cookie 被盜用的情況,它將刪除數據庫中與當前用戶相關的所有 token 記錄,這樣盜用者使用原有的 cookie 將不能再登錄,同時提醒用戶其帳號有被盜用的可能性。
- 如果對應 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