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