<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<!-- 一个简单的Acegi配置 -->
<beans>
<!-- Acegi的过滤器链 -->
<bean id="filterChainProxy" class="org.acegisecurity.util.FilterChainProxy">
<property name="filterInvocationDefinitionSource">
<value><![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/**=httpSessionContextIntegrationFilter,logoutFilter,authenticationProcessingFilter,securityContextHolderAwareRequestFilter,rememberMeProcessingFilter,anonymousProcessingFilter,exceptionTranslationFilter,filterInvocationInterceptor
]]></value>
</property>
</bean>
<!-- 设置一个安全上下文。其中HttpSessionIntegrationFilter适用于大多数情形。它将Authentication对象保存在HTTP会话中,使之能够跨越多个请求。
-->
<bean id="httpSessionContextIntegrationFilter" class="org.acegisecurity.context.HttpSessionContextIntegrationFilter"/>
<bean id="logoutFilter" class="org.acegisecurity.ui.logout.LogoutFilter">
<constructor-arg value="/index.jsp"/> <!-- URL redirected to after logout -->
<constructor-arg>
<list>
<ref bean="rememberMeServices"/>
<bean class="org.acegisecurity.ui.logout.SecurityContextLogoutHandler"/>
</list>
</constructor-arg>
</bean>
<!-- AuthenticationProcessingFilter是处理基于表单身份验证的过滤器。
authenticationFailureUrl指定当身份验证失败时
defaultTargetUrl定义了当出现目标URL不在HTTP会话中的异常情况时将发生什么。
这可能发生在用户通过浏览器书签或其他方式而不是通过SecurityEnforcementFilter到达登录页面的情况下。
filterProcessesUrl告诉AuthenticationProcessingFilter应该拦截哪个URL。
这个URL与登录表单中action属性的值一样。它的默认值为/j_acegi_security_check,
但我们在这里显式定义了该值,用于说明你可以根据需要改变这个值。
-->
<bean id="authenticationProcessingFilter" class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="authenticationFailureUrl" value="/acegilogin.jsp?login_error=1"/>
<property name="defaultTargetUrl" value="/"/>
<property name="filterProcessesUrl" value="/j_acegi_security_check"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
<bean id="securityContextHolderAwareRequestFilter" class="org.acegisecurity.wrapper.SecurityContextHolderAwareRequestFilter"/>
<bean id="rememberMeProcessingFilter" class="org.acegisecurity.ui.rememberme.RememberMeProcessingFilter">
<property name="authenticationManager" ref="authenticationManager"/>
<property name="rememberMeServices" ref="rememberMeServices"/>
</bean>
<bean id="anonymousProcessingFilter" class="org.acegisecurity.providers.anonymous.AnonymousProcessingFilter">
<property name="key" value="changeThis"/>
<property name="userAttribute" value="anonymousUser,ROLE_ANONYMOUS"/>
</bean>
<!-- 访问出现异常时的处理 -->
<bean id="exceptionTranslationFilter" class="org.acegisecurity.ui.ExceptionTranslationFilter">
<!--AuthenticationProcessingFilterEntryPoint是一个提供给用户基于HTML的登录表单的认证入口点。 -->
<property name="authenticationEntryPoint">
<!-- 属性loginFromUrl配置了一个登录表单的URL。当需要用户登录时,
AuthenticationProcessingFilterEntryPoint会将用户重定向到该URL。
-->
<bean class="org.acegisecurity.ui.webapp.AuthenticationProcessingFilterEntryPoint">
<property name="loginFormUrl" value="/acegilogin.jsp"/>
<property name="forceHttps" value="false"/>
</bean>
</property>
<!-- 访问权限禁止处理 -->
<property name="accessDeniedHandler">
<bean class="org.acegisecurity.ui.AccessDeniedHandlerImpl">
<property name="errorPage" value="/accessDenied.jsp"/>
</bean>
</property>
</bean>
<!-- FilterSecurityInterceptor类负责执行安全拦截器的工作 -->
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
<!-- 认证管理器Bean的引用 -->
<property name="authenticationManager" ref="authenticationManager"/>
<!-- 访问决策(即授权)管理器Bean的引用 -->
<property name="accessDecisionManager">
<!-- Acegi的访问决策管理器如何计票
访问决策管理器 如 何 决 策
AffirmativeBased 当至少有一个投票者投允许访问票时允许访问
ConsensusBased 当所有投票者都投允许访问票时允许访问
UnanimousBased 当没有投票者投拒绝访问票时允许访问
-->
<bean class="org.acegisecurity.vote.AffirmativeBased">
<!--默认地,当全部投票者都投弃权票时,所有的访问决策管理者都将拒绝访问资源。
你可以配合为true,即建立了一个“沉默即同意”的策略。换句话说,如果所有的投票者都放弃投票,
则如同它们都投赞成票一样,访问被授权。
-->
<property name="allowIfAllAbstainDecisions" value="false"/>
<property name="decisionVoters">
<!-- decisionVoters属性为访问决策管理器提供一组投票者 -->
<list>
<!-- RoleVoter只在受保护资源有以ROLE_为前缀的配置属性才进行投票。然而,ROLE_前缀只是默认值。你可以选择通过设置rolePrefix属性来重载这个默认前缀:
<bean id="roleVoter"
class="net.sf.acegisecurity.vote.RoleVoter">
<property name="rolePrefix">
<value>GROUP_</value>
</property>
</bean>
在这里,默认的前缀被重载为GROUP_。
-->
<bean class="org.acegisecurity.vote.RoleVoter"/>
<bean class="org.acegisecurity.vote.AuthenticatedVoter"/>
</list>
</property>
</bean>
</property>
<!-- 属性objectDefinitionSource告诉安全拦截器被拦截的各种请求所需要的授权是什么.
第一行是一个指令,表明在比较请求的URL在和紧跟其后定义的模式之前必须首先正规化为小写字母。
该属性的其余几行将URL模式映射为允许用户访问这些URL时必须授予用户的权限。
PATTERN_TYPE_APACHE_ANT指令则URL模式可以采用类似与ANT,或不添加该指令,URL模式以正则表达式的形式描述,如:
<property name="objectDefinitionSource">
<value>
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
\A/admin/.*\Z=ROLE_ADMIN
\A/student/.*\Z=ROLE_STUDENT,ROLE_ALUMNI
\A/instruct/.*\Z=ROLE_INSTRUCTOR
</value>
</property>
-->
<property name="objectDefinitionSource">
<value><![CDATA[
CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
PATTERN_TYPE_APACHE_ANT
/secure/extreme/**=ROLE_SUPERVISOR
/secure/**=IS_AUTHENTICATED_REMEMBERED
/**=IS_AUTHENTICATED_ANONYMOUSLY
]]></value>
</property>
</bean>
<bean id="rememberMeServices" class="org.acegisecurity.ui.rememberme.TokenBasedRememberMeServices">
<property name="userDetailsService" ref="userDetailsService"/>
<property name="key" value="changeThis"/>
</bean>
<!-- 认证管理器负责确定用户身份的
ProviderManager是认证管理器的一个实现,它将验证身份的责任委托给一个或多个认证提供者.
ProviderManag