spring security 關於認證的一些特殊場景配置

       最近一直使用spring security2.0.x配置一些關於登陸認證方面的使用,我們的項目中有幾個特殊的場景,記錄下來,這些場景是我在百度/google沒有搜到的(maybe我的搜索策略太低級)。

        場景1.某些用戶只允許允許單點登陸(即不允許同一用戶在多臺機器同時在線),某些用戶允許多點登陸(即允許同一用戶在多臺機器上同時在線)。

     解決方法:主要是org.springframework.security.concurrent.ConcurrentSessionControllerImpl中的getMaximumSessionsForThisUser方法進行改造。根據我的場景,針對某些用戶返回1,某些用戶返回-1(表示session使用數無限制)。

     另需要在Application中添加並行會話控制。

  1. <authentication-manager alias="authenticationManager" session-controller-ref="concurrentSessionController"/>  
  2. <beans:bean id="concurrentSessionController" class="xx.xxx.ConcurrentSessionControllerImpl"> 
  3. <beans:property name="maximumSessions" value="1"/> 
  4. <beans:property name"sessionRegistry"  ref="sessionRegistry"/> 
  5. <beans:property name="exceptionIfMaximumExceeded" value="false" />  
  6. </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代碼(這段代碼添加了重定向到主界面的代碼)。

  1. <beans:bean id="concurrentSessionFilter"   class="xx.xxxx.ConcurrentSessionFilterImpl"> 
  2.     <custom-filter position="CONCURRENT_SESSION_FILTER" /> 
  3.     <beans:property name="sessionRegistry" ref="sessionRegistry" /> 
  4.     <beans:property name="expiredUrl" value="/error.js"/> 
  5. </beans:bean> 

兩天分別實現了這兩種場景,方法有些粗暴!但是實用!要開始轉向USB-key的工作了,了以總結一下四天所學及應用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章