最近一直使用spring security2.0.x配置一些關於登陸認證方面的使用,我們的項目中有幾個特殊的場景,記錄下來,這些場景是我在百度/google沒有搜到的(maybe我的搜索策略太低級)。
場景1.某些用戶只允許允許單點登陸(即不允許同一用戶在多臺機器同時在線),某些用戶允許多點登陸(即允許同一用戶在多臺機器上同時在線)。
解決方法:主要是org.springframework.security.concurrent.ConcurrentSessionControllerImpl中的getMaximumSessionsForThisUser方法進行改造。根據我的場景,針對某些用戶返回1,某些用戶返回-1(表示session使用數無限制)。
另需要在Application中添加並行會話控制。
- <authentication-manager alias="authenticationManager" session-controller-ref="concurrentSessionController"/>
- <beans:bean id="concurrentSessionController" class="xx.xxx.ConcurrentSessionControllerImpl">
- <beans:property name="maximumSessions" value="1"/>
- <beans:property name= "sessionRegistry" ref="sessionRegistry"/>
- <beans:property name="exceptionIfMaximumExceeded" value="false" />
- </beans:bean>
需要注意的一點:spring security xsd的版本至少2.0.2,才能支持session-control-ref。(由於之前一直使用2.0.1,找了很久問題所在,才發現是版本不對)。
場景2:我們前臺使用了AJAX方案,他的確帶來不一樣的用戶體驗,但是有一個問題:session過期問題對AJAX的影響。我們希望對於session過期的用戶在其再次進行請求後臺數據(主要是js代碼和action操作)的時候,將頁面重定向到登陸頁面。
解決方案:將concurrentSessionFilter添加到chainFilter中,並對org.springframework.security.concurrent.ConcurrentSessionControllerImpl中的doFilterHttp方法進行改造。我們的簡單實現:對於request的header中"x-requested-with"進行檢查,有則表示是action請求,我們返回自定義的status,在action異常處理中對其進行解析,重定向到登陸界面;沒有則表示是請求js代碼,我們返回expireUrl指向的JS代碼(這段代碼添加了重定向到主界面的代碼)。
- <beans:bean id="concurrentSessionFilter" class="xx.xxxx.ConcurrentSessionFilterImpl">
- <custom-filter position="CONCURRENT_SESSION_FILTER" />
- <beans:property name="sessionRegistry" ref="sessionRegistry" />
- <beans:property name="expiredUrl" value="/error.js"/>
- </beans:bean>
兩天分別實現了這兩種場景,方法有些粗暴!但是實用!要開始轉向USB-key的工作了,了以總結一下四天所學及應用。