- jusescn
- 等级:
- 性别:
- 文章: 67
- 积分: 115
- 来自: 北京
|
实现效果图如下:
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 代码
-
-
-
-
-
-
-
-
-
- public void updateAcl(Class clazz,Serializable id,Sid sid,Permission permission,boolean granting,boolean entriesInheriting,Serializable parentid){
- MutableAcl acl;
- ObjectIdentity oid = new ObjectIdentityImpl(clazz,id);
- try {
- acl = (MutableAcl) mutableAclService.readAclById(oid);
- } catch (NotFoundException nfe) {
- acl = mutableAclService.createAcl(oid);
- }
-
- if ( parentid != null){
- MutableAcl parentacl;
- ObjectIdentity parentoi = new ObjectIdentityImpl(clazz,parentid);
- try {
- parentacl = (MutableAcl) mutableAclService.readAclById(parentoi);
- } catch (NotFoundException nfe) {
- parentacl = mutableAclService.createAcl(parentoi);
- }
- acl.setParent(parentacl);
- }
-
- AccessControlEntry sameAce = null;
- AccessControlEntry[] aces = acl.getEntries();
- if ( aces != null && aces.length >0 ){
- for (int i = 0; i < aces.length; i++) {
- AccessControlEntry ace = aces[i];
- if ( ace.getPermission().getMask() == permission.getMask() && sid.equals(ace.getSid())){
- sameAce = ace;
- break;
- }
- }
- }
-
- if ( sameAce != null){
- acl.deleteAce(sameAce.getId());
- }
-
- acl.insertAce(null, permission, sid, granting);
- acl.setEntriesInheriting(entriesInheriting);
-
- mutableAclService.updateAcl(acl);
- }
如果是从后台直接保存树形(比如采用线程定时更新树形的话),没有web层的请求的话,需要用户后台登陆
保存前添加如下代码
java 代码
- Authentication authRequest = new UsernamePasswordAuthenticationToken(admin,admin,new GrantedAuthority[]{new GrantedAuthorityImpl(role_admin)});
- SecurityContextHolder.getContext().setAuthentication(authRequest);
2、对某用户授予read的权限。
java 代码
- String nodeid = request.getParameter("nodeid");
- String rolename = request.getParameter("rolename");
- String mark = request.getParameter("mark");
- String granted = request.getParameter("granted");
-
- Permission p = mutableAclService.buildFromMask(Integer.parseInt(mark));
- updateAcl(Vssdoc.class, Long.parseLong(nodeid), new GrantedAuthoritySid(rolename), p, Boolean.parseBoolean(granted), true, null);
3、完成了。
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
|
返回顶楼 |
|
|
- jusescn
- 等级:
- 性别:
- 文章: 67
- 积分: 115
- 来自: 北京
|
xml 代码
applicationContext-acegi-acl.xml
- 大小: 39.7 KB
- 大小: 35.1 KB
|
返回顶楼 |
|
|