论坛首页 Java企业应用论坛

基于acegi1.0.5 新的权限模型实现行级细粒度权限控制

浏览 4331 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2007-09-28  

实现效果图如下:
acegi1.05的新的权限模型针对 hsqldb 数据库,移植到到sqlserver/mysql 需要修改如下文件:
org.acegisecurity.acls.jdbc.BasicLookupStrategy ;
org.acegisecurity.acls.jdbc.JdbcMutableAclService;

JdbcMutableAclService 是最主要的类,对acl和ace的操作都集中在该类;
BasicLookupStrategy 只有一个方法readAclsById 获得实例对象的acl。

要点:
1、搭建基础代码可以参考ss2中的acegi实现(完全拷贝),在roleManager中需要特别注意是,如果采用getHibernateTemplate().saveOrUpdate(o);对对象进行保存或者更新的话,在修改角色对于用户或者角色对应资源的保存角色前,应该将缓存中的role对于的用户和资源的authorities清除rolename,然后更新角色实例,保存角色到cache中。
2、采用ss1中对对象保护的方法,新建com.at21.pm.core.security.acl.domain.AclDomainAware标示接口或者需要实现public long getId()方法。
3、编辑applicationContext-acegi-acl.xml(可以拷贝acegi中contact例子中的文件)。
4、解析acl中几个表对象
ACL_SID:用以保存sid的实例 PrincipalSid 用户实例,GrantedAuthoritySid 角色实例。
ACL_OBJECT_IDENTITY:用户需要保存的实例。字段ENTRIES_INHERITING表示是否继承父级权限。
ACL_ENTRY:用户实例对应sid的权限(read/create/delete/admin) 字段MASK标示权限(具体标示参考org.acegisecurity.acls.domain.BasePermission类)字段GRANTING表示是是否授予某用户/角色该实例的某权限

介绍开发树形实例:
1、保存树形到数据库对应表时,保存该对象到acl模型中调用updateAcl()方法。

java 代码

 

  1. /**  
  2.      * @param clazz 需要保护的对象类  
  3.      * @param id 实例对象id  
  4.      * @param sid 角色名/用户名  
  5.      * @param permission 权限  
  6.      * @param granting 授予/拒绝  
  7.      * @param entriesInheriting 是否从父类继承权限  
  8.      * @param parentid 父类实例  
  9.      */  
  10. public void updateAcl(Class clazz,Serializable id,Sid sid,Permission permission,boolean granting,boolean entriesInheriting,Serializable parentid){   
  11.         MutableAcl acl;   
  12.         ObjectIdentity oid = new ObjectIdentityImpl(clazz,id);   
  13.         try {   
  14.             acl = (MutableAcl) mutableAclService.readAclById(oid);   
  15.         } catch (NotFoundException nfe) {   
  16.             acl = mutableAclService.createAcl(oid);   
  17.         }   
  18.            
  19.         if ( parentid != null){   
  20.             MutableAcl parentacl;   
  21.             ObjectIdentity parentoi = new ObjectIdentityImpl(clazz,parentid);   
  22.             try {   
  23.                 parentacl = (MutableAcl) mutableAclService.readAclById(parentoi);   
  24.             } catch (NotFoundException nfe) {   
  25.                 parentacl = mutableAclService.createAcl(parentoi);   
  26.             }   
  27.             acl.setParent(parentacl);   
  28.         }   
  29.            
  30.         AccessControlEntry sameAce = null;   
  31.         AccessControlEntry[] aces = acl.getEntries();   
  32.         if ( aces != null && aces.length >0 ){   
  33.             for (int i = 0; i < aces.length; i++) {   
  34.                 AccessControlEntry ace = aces[i];   
  35.                 if ( ace.getPermission().getMask() == permission.getMask() && sid.equals(ace.getSid())){   
  36.                     sameAce = ace;   
  37.                     break;   
  38.                 }   
  39.             }   
  40.         }   
  41.            
  42.         if ( sameAce != null){   
  43.             acl.deleteAce(sameAce.getId());   
  44.         }   
  45.            
  46.         acl.insertAce(null, permission, sid, granting);   
  47.         acl.setEntriesInheriting(entriesInheriting);   
  48.            
  49.         mutableAclService.updateAcl(acl);   
  50.     }  

如果是从后台直接保存树形(比如采用线程定时更新树形的话),没有web层的请求的话,需要用户后台登陆
保存前添加如下代码

java 代码
  1. Authentication authRequest = new UsernamePasswordAuthenticationToken(admin,admin,new GrantedAuthority[]{new GrantedAuthorityImpl(role_admin)});   
  2.         SecurityContextHolder.getContext().setAuthentication(authRequest);  
2、对某用户授予read的权限。
java 代码
  1. String nodeid = request.getParameter("nodeid");   
  2. String rolename = request.getParameter("rolename");   
  3. String mark = request.getParameter("mark");   
  4. String granted = request.getParameter("granted");   
  5.                
  6. Permission p = mutableAclService.buildFromMask(Integer.parseInt(mark));   
  7. updateAcl(Vssdoc.class, Long.parseLong(nodeid), new GrantedAuthoritySid(rolename), p, Boolean.parseBoolean(granted), truenull);  
3、完成了。

 

   发表时间:2007-09-28  
xml 代码
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">  
  3.   
  4. <beans>  
  5.   
  6.   <bean id="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"  
  7.         class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
  8.     <property name="staticField" value="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"/>  
  9.   </bean>  
  10.   <bean id="org.acegisecurity.acls.domain.BasePermission.READ"  
  11.         class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
  12.     <property name="staticField" value="org.acegisecurity.acls.domain.BasePermission.READ"/>  
  13.   </bean>  
  14.   <bean id="org.acegisecurity.acls.domain.BasePermission.DELETE"  
  15.         class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">  
  16.     <property name="staticField" value="org.acegisecurity.acls.domain.BasePermission.DELETE"/>  
  17.   </bean>  
  18.   
  19.   <!-- An access decision voter that reads ACL_CONTACT_READ configuration settings -->  
  20.   <bean id="aclReadVoter" class="org.acegisecurity.vote.AclEntryVoter">  
  21.     <constructor-arg ref="aclService"/>  
  22.     <constructor-arg value="ACL_READ"/>  
  23.     <constructor-arg>  
  24.       <list>  
  25.         <ref local="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"/>  
  26.         <ref local="org.acegisecurity.acls.domain.BasePermission.READ"/>  
  27.       </list>  
  28.     </constructor-arg>  
  29.     <property name="processDomainObjectClass" value="com.at21.pm.core.security.acl.domain.AclDomainAware"/>  
  30.   </bean>  
  31.   
  32.   <!-- An access decision voter that reads ACL_CONTACT_DELETE configuration settings -->  
  33.   <bean id="aclDeleteVoter" class="org.acegisecurity.vote.AclEntryVoter">  
  34.     <constructor-arg ref="aclService"/>  
  35.     <constructor-arg value="ACL_DELETE"/>  
  36.     <constructor-arg>  
  37.       <list>  
  38.         <ref local="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"/>  
  39.         <ref local="org.acegisecurity.acls.domain.BasePermission.DELETE"/>  
  40.       </list>  
  41.     </constructor-arg>  
  42.     <property name="processDomainObjectClass" value="com.at21.pm.core.security.acl.domain.AclDomainAware"/>  
  43.   </bean>  
  44.   
  45.   <!-- An access decision voter that reads ACL_CONTACT_ADMIN configuration settings -->  
  46.   <bean id="aclAdminVoter" class="org.acegisecurity.vote.AclEntryVoter">  
  47.     <constructor-arg ref="aclService"/>  
  48.     <constructor-arg value="ACL_ADMIN"/>  
  49.     <constructor-arg>  
  50.       <list>  
  51.         <ref local="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"/>  
  52.       </list>  
  53.     </constructor-arg>  
  54.     <property name="processDomainObjectClass" value="com.at21.pm.core.security.acl.domain.AclDomainAware"/>  
  55.   </bean>  
  56.   
  57.   <!-- An access decision manager used by the business objects -->  
  58.   <bean id="ACLaccessDecisionManager" class="org.acegisecurity.vote.AffirmativeBased">  
  59.     <property name="allowIfAllAbstainDecisions" value="false"/>  
  60.     <property name="decisionVoters">  
  61.       <list>  
  62.         <ref bean="roleVoter"/>  
  63.         <ref local="aclReadVoter"/>  
  64.         <ref local="aclDeleteVoter"/>  
  65.         <ref local="aclAdminVoter"/>  
  66.       </list>  
  67.     </property>  
  68.   </bean>  
  69.   
  70.   
  71.   
  72.   <bean id="aclCache" class="org.acegisecurity.acls.jdbc.EhCacheBasedAclCache">  
  73.     <constructor-arg>  
  74.       <bean class="org.springframework.cache.ehcache.EhCacheFactoryBean">  
  75.         <property name="cacheManager">  
  76.           <bean class="org.springframework.cache.ehcache.EhCacheManagerFactoryBean"/>  
  77.         </property>  
  78.         <property name="cacheName" value="aclCache"/>  
  79.       </bean>  
  80.     </constructor-arg>  
  81.   </bean>  
  82.   
  83.   <bean id="lookupStrategy" class="org.acegisecurity.acls.jdbc.BasicLookupStrategy">  
  84.     <constructor-arg ref="dataSource"/>  
  85.     <constructor-arg ref="aclCache"/>  
  86.     <constructor-arg ref="aclAuthorizationStrategy"/>  
  87.     <constructor-arg>  
  88.       <bean class="org.acegisecurity.acls.domain.ConsoleAuditLogger"/>  
  89.     </constructor-arg>  
  90.   </bean>  
  91.   
  92.   <bean id="aclAuthorizationStrategy" class="org.acegisecurity.acls.domain.AclAuthorizationStrategyImpl">  
  93.     <constructor-arg>  
  94.       <list>  
  95.         <bean class="org.acegisecurity.GrantedAuthorityImpl">  
  96.           <constructor-arg value="ROLE_ADMINISTRATOR"/>  
  97.         </bean>  
  98.         <bean class="org.acegisecurity.GrantedAuthorityImpl">  
  99.           <constructor-arg value="ROLE_ADMINISTRATOR"/>  
  100.         </bean>  
  101.         <bean class="org.acegisecurity.GrantedAuthorityImpl">  
  102.           <constructor-arg value="ROLE_ADMINISTRATOR"/>  
  103.         </bean>  
  104.       </list>  
  105.     </constructor-arg>  
  106.   </bean>  
  107.   
  108.   <bean id="aclService" class="org.acegisecurity.acls.jdbc.JdbcMutableAclService">  
  109.     <constructor-arg ref="dataSource"/>  
  110.     <constructor-arg ref="lookupStrategy"/>  
  111.     <constructor-arg ref="aclCache"/>  
  112.   </bean>  
  113.   
  114.   
  115.   
  116.   <bean id="afterInvocationManager" class="org.acegisecurity.afterinvocation.AfterInvocationProviderManager">  
  117.     <property name="providers">  
  118.       <list>  
  119.         <ref local="afterAclRead"/>  
  120.         <ref local="afterAclCollectionRead"/>  
  121.       </list>  
  122.     </property>  
  123.   </bean>  
  124.   
  125.   <!-- Processes AFTER_ACL_COLLECTION_READ configuration settings -->  
  126.   <bean id="afterAclCollectionRead"  
  127.         class="org.acegisecurity.afterinvocation.AclEntryAfterInvocationCollectionFilteringProvider">  
  128.     <constructor-arg>  
  129.       <ref bean="aclService"/>  
  130.     </constructor-arg>  
  131.     <constructor-arg>  
  132.       <list>  
  133.         <ref local="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"/>  
  134.         <ref local="org.acegisecurity.acls.domain.BasePermission.READ"/>  
  135.       </list>  
  136.     </constructor-arg>  
  137.   </bean>  
  138.   
  139.   <!-- Processes AFTER_ACL_READ configuration settings -->  
  140.   <bean id="afterAclRead" class="org.acegisecurity.afterinvocation.AclEntryAfterInvocationProvider">  
  141.     <constructor-arg>  
  142.       <ref bean="aclService"/>  
  143.     </constructor-arg>  
  144.     <constructor-arg>  
  145.       <list>  
  146.         <ref local="org.acegisecurity.acls.domain.BasePermission.ADMINISTRATION"/>  
  147.         <ref local="org.acegisecurity.acls.domain.BasePermission.READ"/>  
  148.       </list>  
  149.     </constructor-arg>  
  150.   </bean>  
  151.   
  152.   
  153.   <bean id="securityInterceptor" class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">  
  154.   
  155.     <property name="validateConfigAttributes"><value>false</value></property>  
  156.     <property name="authenticationManager" ref="authenticationManager"/>  
  157.     <property name="accessDecisionManager">  
  158.       <ref local="ACLaccessDecisionManager"/>  
  159.     </property>  
  160.     <property name="afterInvocationManager">  
  161.       <ref local="afterInvocationManager"/>  
  162.     </property>  
  163.     <property name="objectDefinitionSource">  
  164.   
  165.         <ref bean="objectDefinitionSource"/>  
  166.   
  167.     </property>  
  168.   </bean>  
  169.   
  170. </beans>  
applicationContext-acegi-acl.xml
  • 大小: 39.7 KB
  • 大小: 35.1 KB
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics