首先先介绍一下怎么使用这些服务
1,rememberMe服务
a,配置过滤器
-
- <bean id="authenticationProcessingFilter"
- class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
- <property name="authenticationManager">
- <ref bean="authenticationManager" />
- </property>
- <property name="authenticationFailureUrl">
- <value>/Login.html?login_error=1</value>
- </property>
- <property name="defaultTargetUrl">
- <value>/courseInfoList.action</value>
- </property>
- <property name="filterProcessesUrl">
- <value>/j_acegi_security_check</value>
- </property>
- <property name="rememberMeServices">//加上RememberMe服务
- <ref local="rememberMeServices" />
- </property>
- </bean>
-
c,将Remember提供者加入认证管理器上
-
- <bean id="authenticationManager"
- class="org.acegisecurity.providers.ProviderManager">
- <property name="providers">
- <list>
- <ref local="daoAuthenticationProvider" />
- <ref local="rememberMeAuthenticationProvider" />//RememberMe提供者
- <ref local="anonymousAuthenticationProvider" />
- </list>
- </property>
-
-
-
-
- </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了
-
- <bean id="concurrentSessionFilter"
- class="org.acegisecurity.concurrent.ConcurrentSessionFilter">
- <property name="sessionRegistry">
- <ref local="sessionRegistry" />
- </property>
- <property name="expiredUrl">
- <value>/</value>
- </property>
- </bean>
- <bean id="sessionRegistry"
- class="org.acegisecurity.concurrent.SessionRegistryImpl" />
- <bean id="concurrentSessionController"
- class="org.acegisecurity.concurrent.ConcurrentSessionControllerImpl">
- <property name="maximumSessions">
- <value>1</value>
- </property>
- <property name="sessionRegistry">
- <ref local="sessionRegistry" />
- </property>
- </bean>
-
-
- <bean id="rememberMeProcessingFilter"
- class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
- <property name="authenticationManager">
- <ref local="authenticationManager" />
- </property>
- <property name="rememberMeServices">
- <ref local="rememberMeServices" />
- </property>
- </bean>
- <bean id="rememberMeServices"
- class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
- <property name="userDetailsService">
- <ref local="userSecurtyDetails" />
- </property>
- <property name="key">//这里的key是用来保证cookie的真实性,有效性
- <value>springRocks</value>
- </property>
- </bean>
- <bean id="rememberMeAuthenticationProvider"
- class="org.acegisecurity.providers.rememberme.RememberMeAuthenticationProvider">
- <property name="key">
- <value>springRocks</value>
- </property>
- </bean>
-
b,在你的认证过滤器上加上RememberMe服务