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。
從上圖中,我們可以看到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也無法用在默認策略下。