spring security remember me實現自動登錄


1 默認策略

在我們自定義的login中增加一個選擇框

<input type="submit" value="Login" />     <br/> <br/>     <input type="checkbox" value=true name="_spring_security_remember_me" />記住密碼
        <!-- 記住我功能 -->
        <security:remember-me key="elim" />

web.xml中增加成上述就可以實現了。

默認有效時間是兩周,啟用rememberMe之后的兩周內,用戶都可以直接跳過系統,直接進入系統。

實際上,Spring Security中的rememberMe是依賴cookie實現的,當用戶在登錄時選擇使用rememberMe,系統就會在登錄成功后將為用戶生成一個唯一標識,並將這個標識保存進cookie中,我們可以通過瀏覽器查看用戶電腦中的cookie。

rememberMe cookie

圖 16.2. rememberMe cookie

 

從上圖中,我們可以看到Spring Security生成的cookie名稱是SPRING_SECURITY_REMEMBER_ME_COOKIE,它的內容是一串加密的字符串,當用戶再次訪問系統時,Spring Security將從這個cookie讀取用戶信息,並加以驗證。如果可以證實cookie有效,就會自動將用戶登錄到系統中,並為用戶授予對應的權限。

2. 持久化策略

rememberMe的默認策略會將username和過期時間保存到客戶主機上的cookie中,雖然這些信息都已經進行過加密處理,不過我們還可以使用安全級別更高的持久化策略。在持久化策略中,客戶主機cookie中保存的不再用username,而是由系統自動生成的序列號,在驗證時系統會將客戶cookie中保存的序列號與數據庫中保存的序列號進行比對,以確認客戶請求的有效性,之后在比對成功后才會從數據庫中取出對應的客戶信息,繼續進行認證和授權等工作。這樣即使客戶本地的cookie遭到破解,攻擊者也只能獲得一個序列號,而不是用戶的登錄賬號。

如果希望使用持久化策略,我們需要先在數據庫中創建rememberMe所需的表。

create table persistent_logins (
    username varchar(64) not null,
    series varchar(64) primary key,
    token varchar(64) not null,
    last_used timestamp not null
);

然后要為配置文件中添加與數據庫的鏈接。

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.hsqldb.jdbcDriver"/>
    <property name="url" value="jdbc:hsqldb:res:/hsqldb/test"/>
    <property name="username" value="sa"/>
    <property name="password" value=""/>
</bean>
       

最后修改http中的配置,為remember-me添加data-source-ref即可,Spring Security會在初始化時判斷是否存在data-source-ref屬性,如果存在就會使用持久化策略,否則會使用上述的默認策略。

<http auto-config='true'>
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
    <remember-me data-source-ref="dataSource"/>
</http>

默認策略和持久化策略是不能混用的,如果你首先在應用中使用過默認策略的rememberMe,未等系統過期便換成了持久化策略,之前保留的cookie也無法通過系統驗證,實際上系統會將cookie當做無效標識進行清除。同樣的,持久化策略中生成的cookie也無法用在默認策略下。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM