acegi用session控制併發和RememberMe的衝突問題

首先先介紹一下怎麼使用這些服務
1,rememberMe服務
a,配置過濾器

  1. <!--authenticationProcessingFilter  start-->  
  2. <bean id="authenticationProcessingFilter"  
  3.     class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">  
  4.     <property name="authenticationManager">  
  5.         <ref bean="authenticationManager" />  
  6.     </property>  
  7.     <property name="authenticationFailureUrl">  
  8.         <value>/Login.html?login_error=1</value>  
  9.     </property>  
  10.     <property name="defaultTargetUrl">  
  11.         <value>/courseInfoList.action</value>  
  12.     </property>  
  13.     <property name="filterProcessesUrl">  
  14.         <value>/j_acegi_security_check</value>  
  15.     </property>  
  16.     <property name="rememberMeServices">//加上RememberMe服務   
  17.         <ref local="rememberMeServices" />  
  18.     </property>  
  19. </bean>  
  20. <!--authenticationProcessingFilter end-->  
c,將Remember提供者加入認證管理器上
  1. <!--AuthenticationManager,用於認證ContextHolder中的Authentication對象。-->  
  2. <bean id="authenticationManager"  
  3.            class="org.acegisecurity.providers.ProviderManager">  
  4.                 <property name="providers">  
  5.       <list>  
  6.              <ref local="daoAuthenticationProvider" />  
  7.              <ref local="rememberMeAuthenticationProvider" />//RememberMe提供者   
  8.              <ref local="anonymousAuthenticationProvider" />  
  9.        </list>  
  10.                  </property>  
  11. <!-- 以下注釋掉了,爲什麼註釋掉將在下面解釋,這也是今天的主題--->  
  12. <!--    <property name="sessionController">-->  
  13. <!--        <ref bean="concurrentSessionController" />-->  
  14. <!--    </property>-->  
  15. </bean>  

RemberMe服務介紹完了,下面介紹利用session控制併發
2,利用session控制併發
a,配置過濾器


b,把上面那個id爲authenticationManager的bean中註釋掉的內容添上.

接下來講一下他們之間的衝突(我用的是acegi-security-1.0.3.jar,希望後續版本能修正這個bug):
我把兩者配置好後,測試RememberMe服務時老提示以下錯誤:
 java.lang.IllegalArgumentException: SessionIdentifierAware did not return a Session ID (org.acegisecurity.ui.WebAuthenticationDetails@957e: RemoteIpAddress: 127.0.0.1; SessionId: null)
at org.springframework.util.Assert.hasText(Assert.java:169)
仔細翻了一下羅時飛寫的那個權限管理的書,發現他也提到這個問題,原來兩者不能共存,這也是acegi當前版本的一個bug:
注:當出現我上面這個異常時,可能就是這個問題,要是去掉控制併發的session服務後還出現這個異常,那是因爲你瀏覽器保存的Cookie沒有清除,清除一下就OK了

  1. <!--控制同一用戶名只有一個人在線。start-->  
  2. <bean id="concurrentSessionFilter"  
  3.     class="org.acegisecurity.concurrent.ConcurrentSessionFilter">  
  4.     <property name="sessionRegistry">  
  5.         <ref local="sessionRegistry" />  
  6.     </property>  
  7.     <property name="expiredUrl">  
  8.         <value>/</value>  
  9.     </property>  
  10. </bean>  
  11. <bean id="sessionRegistry"  
  12.     class="org.acegisecurity.concurrent.SessionRegistryImpl" />  
  13. <bean id="concurrentSessionController"  
  14.     class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">  
  15.     <property name="maximumSessions">  
  16.         <value>1</value><!--默認爲1-->  
  17.     </property>  
  18.     <property name="sessionRegistry">  
  19.         <ref local="sessionRegistry" />  
  20.     </property>  
  21. </bean>  
  22. <!--控制同一用戶名只有一個人在線。end -->  

  1. <!--rememberMeProcessingFilter  start-->  
  2. <bean id="rememberMeProcessingFilter"  
  3.     class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">  
  4.     <property name="authenticationManager">  
  5.         <ref local="authenticationManager" />  
  6.     </property>  
  7.     <property name="rememberMeServices">  
  8.         <ref local="rememberMeServices" />  
  9.     </property>  
  10. </bean>  
  11. <bean id="rememberMeServices"  
  12.     class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">  
  13.     <property name="userDetailsService">  
  14.         <ref local="userSecurtyDetails" />  
  15.     </property>  
  16.     <property name="key">//這裏的key是用來保證cookie的真實性,有效性   
  17.         <value>springRocks</value>  
  18.     </property>  
  19. </bean>  
  20. <bean id="rememberMeAuthenticationProvider"  
  21.     class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">  
  22.     <property name="key">  
  23.         <value>springRocks</value>  
  24.     </property>  
  25. </bean>  
  26. <!--rememberMeProcessingFilter  end-->  
b,在你的認證過濾器上加上RememberMe服務
發佈了2 篇原創文章 · 獲贊 1 · 訪問量 4137
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章