`
xxtianxiaxing
  • 浏览: 707341 次
  • 性别: Icon_minigender_1
  • 来自: 陕西
社区版块
存档分类
最新评论

Acegi ACL使用说明

阅读更多

Acegi ACL使用说明 
本文假设你对Acegi其他部分已经比较熟悉。Acegi 的ACL控制是建立在对相应业务方法拦截的基础上的。这里以Acegi自带的contacts例子来说明。
先看看总的配置:
<bean id="contactManagerSecurity" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
      <property name="authenticationManager"><ref bean="authenticationManager"/></property>
      <property name="accessDecisionManager"><ref local="businessAccessDecisionManager"/></property>
      <property name="afterInvocationManager"><ref local="afterInvocationManager"/></property>
      <property name="objectDefinitionSource">
         <value>
            sample.contact.ContactManager.getAll=AFTER_ACL_COLLECTION_READ
            sample.contact.ContactManager.getById=AFTER_ACL_READ
            sample.contact.ContactManager.delete=ACL_CONTACT_DELETE
            sample.contact.ContactManager.deletePermission=ACL_CONTACT_ADMIN
            sample.contact.ContactManager.addPermission=ACL_CONTACT_ADMIN
         </value>
      </property>
   </bean>该拦截器实现了org.aopalliance.intercept.MethodInterceptor接口。在方法被调用之前,拦截器会先调用 AuthenticationManager判断用户身份是否已验证,然后从objectDefinitionSource中获取方法所对应的权限,再调用AccessDecisionManager来匹配用户权限和方法对应的权限。如果用户没有足够权限调用当前方法,则抛出 AccessDeniedException使方法不能被调用。方法调用后会调用AfterInvocationManager对返回的结果进行再次处理。下面依次说明。
AccessDecisionManager的配置:
<bean id="businessAccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">
      <property name="allowIfAllAbstainDecisions"><value>false</value></property>
      <property name="decisionVoters">
         <list>
            <ref local="roleVoter"/>
            <ref local="aclContactReadVoter"/>
            <ref local="aclContactDeleteVoter"/>
            <ref local="aclContactAdminVoter"/>
         </list>
      </property>
   </bean>AccessDecisionManager接口有decide()和support()方法。decide()方法决策是否批准通过即方法是否容许调用,如果没抛出AccessDeniedException则为允许访问资源,否则拒绝访问。support()方法是根据配置属性和受保护资源的类来判断是否需要对该资源作出决策判断。
AccessDecisionManager的 decisionVoters属性需要一个或多个Voter(投票者),Voter必须实现AccessDecisionVoter 接口。Voter的工作是去匹配用户已拥有的权限和受保护的资源要求的权限,在该资源有相应权限的情况下,如果匹配则投允许票,否则投反对票。 
allowIfAllAbstainDecisions属性表示是否允许所有都弃权时就通过。Voter的实现类RoleVoter在当受保护资源的名字由ROLE_开始时才参与投票。
AccessDecisionManager有三个实现类,功能各不相同:
AffirmativeBased: 当至少有一个Voter投允许票时才通过
UnanimousBased: 没有Voter投反对票时才通过
ConsensusBased: 当所有Voter都投允许票时才通过
下面列出一个Voter的配置:
<bean id="aclContactDeleteVoter" class="org.acegisecurity.vote.BasicAclEntryVoter">
      <property name="processConfigAttribute"><value>ACL_CONTACT_DELETE</value></property>
      <property name="processDomainObjectClass"><value>sample.contact.Contact</value></property>
      <property name="aclManager"><ref local="aclManager"/></property>
      <property name="requirePermission">
        <list>
          <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"/>
          <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.DELETE"/>
        </list>
      </property>
   </bean>上面第一个配置里有这么一行:sample.contact.ContactManager.delete=ACL_CONTACT_DELETE
所以在调用sample.contact.ContactManager.delete这个方法时aclContactDeleteVoter会参与投票,它会获得sample.contact.Contact这个对象(这个对象从delete方法的参数中获得),然后通过aclManager去获得当前用户对该Contact实例的ACL权限,最后拿这个权限与我们需要的权限比对,我们配置需要的权限是org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION和org.acegisecurity.acl.basic.SimpleAclEntry.DELETE。如果我们通过aclManager获得的权限包括这两个配置的权限之一,Voter就投容许票,方法容许调用。如果不包括,那对不起,反对票,AccessDecisionManager就会抛出AccessDeniedException。方法拒绝调用。
AclManager的配置:
<bean id="aclManager" class="org.acegisecurity.acl.AclProviderManager">
      <property name="providers">
         <list>
            <ref local="basicAclProvider"/>
         </list>
      </property>
   </bean>

   <bean id="basicAclProvider" class="org.acegisecurity.acl.basic.BasicAclProvider">
      <property name="basicAclDao"><ref local="basicAclExtendedDao"/></property>
   </bean>

   <bean id="basicAclExtendedDao" class="org.acegisecurity.acl.basic.jdbc.JdbcExtendedDaoImpl">
      <property name="dataSource"><ref bean="dataSource"/></property>
   </bean>AclManager是整个ACL中一个很核心的概念,它包含了两个方法AclEntry[] getAcls(Object domainInstance)和
AclEntry[] getAcls(Object domainInstance, Authentication authentication)。在了解这两个方法前,我们先了解AclEntry这个对象。AclEntry只是一个接口,系统中一般都是造型为BasicAclEntry。它包括了这个Entry所保护的domainObject instance(这里是Contact),实际它实现上是以AclObjectIdentity来替代这个domainObject的(domainClass+domainObjectId);它包括了谁(Recipient)拥有这个domainObject instance以及他所对这个domainObject instance的操作权限(mask)。
一个domainObject instance对应了多个AclEntry,比如一条通讯录张三可以查看,而李四可以管理,一个Contact instance就对应了两个AclEntry,第一个AclEntry包含信息:所保护的domainObject(Contact),谁(张三),权限(查看);第二个AclEntry包含信息:所保护的domainObject(Contact),谁(李四),权限(管理)。
这样AclManager的两个方法就很好理解了getAcls(Object domainInstance)返回所有这个domainInstance所对应的权限信息,
getAcls(Object domainInstance, Authentication authentication)在第一个方法返回结果的基础上做了过滤,过滤出和authentication(当前用户)相关的权限信息。如果当前用户是张三,则返回与张三对应的记录。

这样Acegi就会拦截业务方法发挥相应的作用,但是在业务方法返回一个List或是单个domainObject instance的时候,同样也是需要把用户没有权限查看的domainObject instance过滤掉的,这时就要用afterInvocationManager了,看配置:
<bean id="afterInvocationManager" class="org.acegisecurity.afterinvocation.AfterInvocationProviderManager">
      <property name="providers">
         <list>
            <ref local="afterAclRead"/>
            <ref local="afterAclCollectionRead"/>
         </list>
      </property>
   </bean>
   
   <!-- Processes AFTER_ACL_COLLECTION_READ configuration settings -->
   <bean id="afterAclCollectionRead" class="org.acegisecurity.afterinvocation.BasicAclEntryAfterInvocationCollectionFilteringProvider">
      <property name="aclManager"><ref local="aclManager"/></property>
      <property name="requirePermission">
        <list>
          <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"/>
          <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.READ"/>
        </list>
      </property>
   </bean>
   
   <!-- Processes AFTER_ACL_READ configuration settings -->
   <bean id="afterAclRead" class="org.acegisecurity.afterinvocation.BasicAclEntryAfterInvocationProvider">
      <property name="aclManager"><ref local="aclManager"/></property>
      <property name="requirePermission">
        <list>
          <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.ADMINISTRATION"/>
          <ref local="org.acegisecurity.acl.basic.SimpleAclEntry.READ"/>
        </list>
      </property>
   </bean>afterAclCollectionRead会对配置AFTER_ACL_COLLECTION_READ的方法进行拦截,这里是sample.contact.ContactManager.getAll方法,它会遍历方法返回的domainObject,然后挨个通过aclManager判断当前用户对domainObject的权限,如果和需要的权限不和,则过滤掉。呵呵,传说中的虎牙子就在此时产生了!
afterAclRead则依次类推。
参考了ss wiki里相关的文档,特别是差沙和cac的文档,写的相当好。另外acegi的代码也是相当的易读。


http://www.blogjava.net/ronghao 荣浩原创,转载请注明出处:)

分享到:
评论

相关推荐

    acegi使用说明acegi原理及如何与spring、hibernate结合

    它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。因此,Acegi安全系统能够轻松地适用于复杂的安全需求。 安全涉及到两个不同的概念,认证和授权。前者是关于...

    spring acegi 使用工程demo

    这个"spring acegi 使用工程demo"显然是一个示例项目,旨在帮助开发者理解和实践如何在Spring应用中集成和使用Acegi安全框架。 首先,Acegi是Spring Security的前身,后来被Spring Security所取代,但它的概念和...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架

    它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。通过精心 配置Acegi安全系统能够轻松地适用于复杂的安全需求。它既能应用于WEB应用也能应用于非WEB应用。在 ...

    权限Acegi的使用

    5. **测试和调试**:进行充分的测试以确保安全配置正确无误,可以使用Acegi提供的安全测试工具来辅助调试。 随着Spring Security的出现,虽然Acegi不再维护,但其设计理念和模式在Spring Security中得到了延续和...

    Acegi使用.pdf

    - **依赖Spring框架**:Acegi基于Spring构建,这意味着应用必须先支持Spring框架才能使用Acegi。 - **学习曲线**:对于初次接触的开发者而言,Acegi的复杂性和灵活性可能会带来较高的学习成本。 #### 结论 Acegi...

    acegi的使用

    Acegi 使用 Servlet 过滤器来保护 Web 应用,通过身份认证和授权来确保系统的安全性。该框架利用了 Spring 框架的依赖注入和面向切面编程(AOP)特性,使得安全功能可以独立于应用代码,降低了安全性和业务逻辑之间的...

    Acegi 详细配置说明

    6. **权限表达式(Permission Expressions)**:Acegi支持使用SpEL(Spring Expression Language)来表达复杂的权限逻辑。 在实际应用中,我们通常会在Spring的XML配置文件中定义这些组件。例如,为了配置认证管理...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应

    然后,我们可以使用`&lt;security:intercept-url&gt;`标签来定义URL的安全策略,例如哪些URL需要登录,哪些URL对特定角色开放。 接着,我们需要实现`UserDetailsService`接口,提供用户信息的查询服务。这通常涉及到...

    acegi

    Acegi 是一个在Java开发领域,特别是Spring框架中曾经广泛使用的安全组件,全称为Acegi Security。这个系统为Spring应用程序提供了全面的安全管理解决方案,包括身份验证、授权、会话管理以及安全事件处理等功能。...

    基于java的ACEGI

    在《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf》中,可能会详细讲解如何配置和使用Acegi。以下是一些关键步骤: 1. **添加依赖**:首先,在项目中引入Acegi的依赖库,通常是通过Maven或...

    Acegi_使用.doc

    2. **AspectJ Join Point**:使用AspectJ来管理Domain Object实例的安全,特别适合那些不在Spring Bean容器管理范围内的对象。通过Acegi,可以对标准构造函数(如`new Person()`)进行安全控制。 3. **...

    使用acegi控制用户权限实例

    在本实例中,我们将深入探讨如何使用Acegi来控制用户的权限。Acegi Security已经被Spring Security替代,但其核心思想和机制仍然适用于现代的Spring Security。 首先,我们需要理解Acegi的基础概念。Acegi的核心是`...

    Acegi框架介绍 acegi安全与认证

    对于领域对象的访问,Acegi会在执行Bean方法前检查访问控制列表(ACL),确保用户有权操作该对象。 5. **体系结构** Acegi的核心组件包括AuthenticationManager负责身份认证,AccessDecisionManager负责访问控制...

    实战Acegi_使用Acegi作为基于Spring框架的WEB应用的安全框架

    它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和面向接口的编程方式。通过精心 配置Acegi安全系统能够轻松地适用于复杂的安全需求。它既能应用于WEB应用也能应用于非WEB应用。在 ...

    实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf

    《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架》这本书提供了一个很好的起点,它详细介绍了如何设置和使用Acegi,以及如何解决实际开发中的安全问题。 总的来说,Acegi为基于Spring的Web应用提供...

    使用Acegi作为基于Spring框架的WEB应用的安全框架

    本文将深入探讨如何利用Acegi来增强基于Spring的应用程序的安全性,并结合给定的资源进行详细说明。 一、Acegi Security概述 Acegi Security(现为Spring Security)是一个全面且高度可配置的安全框架,它提供了...

    acegi+cas整合工程及说明1

    将acegi和cas的war包修改并整合测试,里面包含所需依赖包。经过分卷压缩一共3个文件.

Global site tag (gtag.js) - Google Analytics