Spring Security Acegi 学习之路四 (转)
安全对象访问控制
?
?
匿名用户权限信息
?
?
<bean id="filterChainProxy" value="anonymousUser"/> <!--匿名用户用户属性 --> <property name="userAttribute" value="ANONYMOUSUSER,PRIV_ANONYMOUS"/></bean><!--匿名用户认证提供者 --><bean id="anonymousAuthenticationProvider"value="anonymousUser"/></bean><bean id="authenticationManager"anonymousAuthenticationProvider" /> </list> </property></bean>??URL资源访问控制
<bean id="filterChainProxy" ref="authenticationManager"/><property name="asscessDecisionManager" ref=" asscessDecisionManager"/><property name="objectDefinitionSource"><value> CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON PATTERN_TYPE_APACHE_ANT /login.jsp=PRIV_ANONYMOUS,PRIV_COMMON /hello_1.jsp=PRIV_1 /updateForum.jsp=PRIV_1</value></property></bean><!--HTTP请求访问决策管理器--><bean id="asscessDecisionManager" value="true"/><!--投票者列表-->< property name="decisionVoters"><list> <ref bean="roleVoter"/></list></property></bean><bean id="roleVoter" value="PRIV_"/></bean>?
?
1.判断用户是否已经通过身份认证,如果未通过身份认证,调用身份认证管理器进行处理,这意味着请求将重定向到登录页面。
2.如果通过身份认证,调用访问决策管理器判断用户是否有权访问目标的URL资源。
3.访问决策管理器将组织投票者进行投票并根据投票结果给出是否有权访问的结果。
4.如果无权访问,将招聘异常否则开放目标URL资源的访问。
?
?? ?我们定义的AccessDecisionManager Bean,它通过组织投票者对是否允许访问进行投票并得到最终的结果。所有投票者都实现AccessDecisionVoter接口,决策管理器投票者的int vote(Authenticationauthentication, Object object, ConfigAttributeDefinition config)方法获得投票结果。有三个不同的投票结果:
ACCESS_ABSTAIN:弃权
ACCESS_DENIED:拒绝
ACCESS_GRANTED:允许
?
?? ?根据不同决策方案,Acegi在org.acegisecurity.vote包中提供了三个AccessDecisionManager的实现类:
AffirmativeBased:有同意票策略
ConsensusBased:少数服从多数策略
UnanimousBased:无反对票策略
?
?
异常转换过滤器
?
?
?? ?异常转换过滤器(ExceptionTranslationFilter)能够捕捉Acegi招聘的抛出的权限访问异常,并导向适合响应页面,大大提高了系统交互的友好性。
注意,exceptionTranslationFilter必须位于filterSecurityIntercetor之前。
?
<bean id="filterChainProxy" value="/error.jsp"/></bean></property></bean><bean id="authenticationEntryPoint" value="/index.jsp"/></bean>?
?
业务类方法访问控制
?? ?Acegi为业务类安全对象添加环绕增强的切面,在业务类方法被访问前后就可以进行拦截并实施访问控制,Acegi提供了两种实施环绕增强切面的方案,Spring AOP和AspectJ,这里我们看一下Spring AOP 方案:
<bean id="methodSecurityInterceptor" ref="authenticationManager"/><property name="asscessDecisionManager" ref=" asscessDecisionManager"/><property name="objectDefinitionSource"><value>com.ccd.service.BbtForum.updateForum=PRIV_2</value></property></bean><bean id="bbtForum" value="true"/><property name="target" ref="bbtForumTarget"/></bean><bean id="bbtForumTarget"style="line-height: 15.75pt;">?? Acegi支持通过注解提供对象定义源的无数据信息
?
?? ?Acegi通过MethodDefinitionAttributes 自动扫描Spring容器中的Bean,获取注解表示对象定义元数据信息
applicationContext-acegi-plugin.xml:基于注解的对象定义源
?
<bean id="methodSecurityInterceptor" ref="authenticationManager"/><property name="asscessDecisionManager" ref=" asscessDecisionManager"/><property name="objectDefinitionSource" ref="objectDefinitionSource"/></bean><!--根据Bean的注解元数据定义的对象定义源--><bean id="objectDefinitionSource" name="code"><bean name="code"><bean style="line-height: 15.75pt;">?
?
?
applicationContext-acegi-plugin.xml: 通过指定Bean名字进行批量代理
?
<bean style="line-height: 15.75pt;">PS:本文主要摘自《精通Spring 2.x ——企业应用开发详解》