首先先介紹一下怎麼使用這些服務
1,rememberMe服務
a,配置過濾器
- <!--authenticationProcessingFilter start-->
- <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>
- <!--authenticationProcessingFilter end-->
- <!--AuthenticationManager,用於認證ContextHolder中的Authentication對象。-->
- <bean id="authenticationManager"
- class="org.acegisecurity.providers.ProviderManager">
- <property name="providers">
- <list>
- <ref local="daoAuthenticationProvider" />
- <ref local="rememberMeAuthenticationProvider" />//RememberMe提供者
- <ref local="anonymousAuthenticationProvider" />
- </list>
- </property>
- <!-- 以下注釋掉了,爲什麼註釋掉將在下面解釋,這也是今天的主題--->
- <!-- <property name="sessionController">-->
- <!-- <ref bean="concurrentSessionController" />-->
- <!-- </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了
- <!--控制同一用戶名只有一個人在線。start-->
- <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><!--默認爲1-->
- </property>
- <property name="sessionRegistry">
- <ref local="sessionRegistry" />
- </property>
- </bean>
- <!--控制同一用戶名只有一個人在線。end -->
- <!--rememberMeProcessingFilter start-->
- <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>
- <!--rememberMeProcessingFilter end-->