配置拦截过滤器
<bean id="filterInvocationInterceptor" class="org.acegisecurity.intercept.web.FilterSecurityInterceptor"> <property name="authenticationManager" ref="authenticationManager" /> <property name="accessDecisionManager" ref="accessDecisionManager" /> <property name="objectDefinitionSource"> <value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /protected/engineering/**=ROLE_HEAD_OF_ENGINEERING /protected/marketing/**=ROLE_HEAD_OF_MARKETING /**=IS_AUTHENTICATED_ANONYMOUSLY </value> </property> </bean> |
配置访问决策管理器
<bean id="accessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
<property name="decisionVoters">
<list>
<bean class="org.acegisecurity.vote.RoleVoter"/>
<bean class="org.acegisecurity.vote.AuthenticatedVoter" />
</list>
</property>
</bean>
以上是security配置投票管理器的代码 ,accessDecisionManager bean 是 org.acegisecurity.vote.AffirmativeBased
类的实例。accessDecisionManager
bean 只包含一个参数,即投票者(voter)列表。
在 Acegi 中,投票者确定是否允许某个用户访问特定的资源。当使用 accessDecisionManager
查询时,投票者具有三个选项:允许访问(access-granted)、拒绝访问(access-denied),如果不确定的话则放弃投票(abstain from voting)。
不同类型的访问决策管理器解释投票者决策的方法也有所不同。清单 10 所示的 AffirmativeBased
访问决策管理器实现了简单的决策逻辑:如果任何投票者强制执行肯定投票,将允许用户访问所请求的资源。
Acegi 提供了若干个投票者实现类型。accessDecisionManager
将经过验证的用户的信息(包括用户的业务角色信息)和 objectDefinitionSource
对象传递给投票者。本文的示例使用了两种类型的投票者,RoleVoter
和 AuthenticatedVoter
,如清单 10 所示。现在看一下每种投票者的逻辑:
- RoleVoter 只有在
objectDefinitionSource
对象的行中找到以ROLE_
前缀开头的角色时才进行投票。如果RoleVoter
没有找到这样的行,将放弃投票;如果在用户业务角色中找到一个匹配的角色,它将投票给允许访问;如果没有找到匹配的角色,则投票给拒绝访问。在拦截过滤器中,有两个角色具有ROLE_
前缀:ROLE_HEAD_OF_ENGINEERING
和ROLE_HEAD_OF_MARKETING
。 - AuthenticatedVoter 只有在
objectDefinitionSource
对象中找到具有某个预定义角色的行时才进行投票。在拦截过滤器 中,有这样一行:IS_AUTHENTICATED_ANONYMOUSLY
。匿名身份验证意味着用户不能够进行身份验证。找到该行后,AuthenticatedVoter
将检查一个匿名身份验证的用户是否可以访问某些不受保护的资源(即这些资源没有包含在具备ROLE_
前缀的行中)。如果AuthenticatedVoter
发现所请求的资源是不受保护的并且objectDefinitionSource
对象允许匿名身份验证的用户访问不受保护的资源,它将投票给允许访问;否则就投票给拒绝访问。