AclManagerImpl.java
上传用户:kimgenplus
上传日期:2016-06-05
资源大小:20877k
文件大小:6k
源码类别:

OA系统

开发平台:

Java

  1. package com.bjsxt.oa.managers.impl;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Map;
  7. import java.util.Set;
  8. import com.bjsxt.oa.managers.AclManager;
  9. import com.bjsxt.oa.model.ACL;
  10. import com.bjsxt.oa.model.Permission;
  11. public class AclManagerImpl extends AbstractManager implements AclManager {
  12. //授权过程
  13. public void addOrUpdatePermission(String principalType, int principalSn,
  14. int resourceSn, int permission, boolean yes) {
  15. //根据主体标识和资源标识查找ACL实例
  16. ACL acl = findACL(principalType, principalSn, resourceSn);
  17. //如果存在ACL实例,则更新其授权
  18. if(acl != null){
  19. acl.setPermission(permission, yes);
  20. getHibernateTemplate().update(acl);
  21. return;
  22. }
  23. //不存在ACL实例,则创建ACL实例
  24. acl = new ACL();
  25. acl.setPrincipalType(principalType);
  26. acl.setPrincipalSn(principalSn);
  27. acl.setResourceSn(resourceSn);
  28. acl.setPermission(permission, yes);
  29. getHibernateTemplate().save(acl);
  30. }
  31. //设置用户某个资源授权的继承特性
  32. public void addOrUpdateUserExtends(int userId, int resourceSn, boolean yes) {
  33. //根据主体标识和资源标识查找ACL实例
  34. ACL acl = findACL(ACL.TYPE_USER, userId, resourceSn); 
  35. //如果存在ACL实例,则更新其授权
  36. if(acl != null){
  37. acl.setExtends(yes);
  38. getHibernateTemplate().update(acl);
  39. return;
  40. }
  41. //不存在ACL实例,则创建ACL实例
  42. acl = new ACL();
  43. acl.setPrincipalType(ACL.TYPE_USER);
  44. acl.setPrincipalSn(userId);
  45. acl.setResourceSn(resourceSn);
  46. acl.setExtends(yes);
  47. getHibernateTemplate().save(acl);
  48. }
  49. //删除授权
  50. public void delPermission(String principalType, int principalSn,
  51. int resourceSn) {
  52. getHibernateTemplate().delete(findACL(principalType, principalSn, resourceSn));
  53. }
  54. //即时认证
  55. public boolean hasPermission(int userId, int resourceSn, int permission) {
  56. //查找直接授予用户的授权
  57. ACL acl = findACL(ACL.TYPE_USER, userId, resourceSn);
  58. if(acl != null){
  59. int yesOrNo = acl.getPermission(permission);
  60. //如果是确定的授权
  61. if(yesOrNo != ACL.ACL_NEUTRAL){
  62. return yesOrNo == ACL.ACL_YES ? true : false;
  63. }
  64. }
  65. //继续查找用户的角色授权
  66. String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
  67. "where u.id = ? order by ur.orderNo";
  68. List aclIds = getHibernateTemplate().find(hql, userId);
  69. //依照角色优先级依次查找其授权
  70. for (Iterator iter = aclIds.iterator(); iter.hasNext();) {
  71. Integer rid = (Integer) iter.next();
  72. acl = findACL(ACL.TYPE_ROLE, rid, resourceSn);
  73. //一旦发现授权,即可返回结果
  74. if(acl != null){
  75. return acl.getPermission(permission) == ACL.ACL_YES ? true : false;
  76. }
  77. }
  78. return false;
  79. }
  80. public boolean hasPermissionByResourceSn(int userId, String resourceSn, int permission) {
  81. String hql = "select m.id from Module m where m.sn = ? ";
  82. return hasPermission(
  83. userId,
  84. (Integer)getSession().createQuery(hql).setParameter(0, resourceSn).uniqueResult(),
  85. permission);
  86. }
  87. //搜索某个用户拥有读取权限的模块列表(用于登录,形成导航菜单的时候)
  88. public List searchModules(int userId) {
  89. //定义临时变量
  90. Map temp = new HashMap();
  91. //按优先级从低到高查找用户拥有的角色
  92. String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
  93. "where u.id = ? order by ur.orderNo desc";
  94. List aclIds = getHibernateTemplate().find(hql, userId);
  95. //依次循环角色
  96. for (Iterator iter = aclIds.iterator(); iter.hasNext();) {
  97. Integer rid = (Integer) iter.next();
  98. //根据角色获得角色拥有的授权列表
  99. List acls = findRoleACLs(rid);
  100. //把授权放入临时变量
  101. for (Iterator iterator = acls.iterator(); iterator.hasNext();) {
  102. ACL acl = (ACL) iterator.next();
  103. temp.put(acl.getResourceSn(), acl);
  104. }
  105. }
  106. //查找直接授予用户的授权列表
  107. List acls = findUserACLs(userId);
  108. for (Iterator iter = acls.iterator(); iter.hasNext();) {
  109. ACL acl = (ACL) iter.next();
  110. temp.put(acl.getResourceSn(), acl);
  111. }
  112. //现在已获得用户拥有的所有授权(包括直接授予用户自身以及其包含的角色的授权)
  113. List delResources = new ArrayList();
  114. Set entries = temp.entrySet();
  115. for (Iterator iter = entries.iterator(); iter.hasNext();) {
  116. Map.Entry entry = (Map.Entry) iter.next();
  117. ACL acl = (ACL)entry.getValue();
  118. //如果没有读取权限,则需要在临时变量中删除这个授权
  119. if(acl.getPermission(Permission.READ) == ACL.ACL_NO){
  120. delResources.add(entry.getKey());
  121. }
  122. }
  123. //在临时变量中删除这些需要删除的授权
  124. for (Iterator iter = delResources.iterator(); iter.hasNext();) {
  125. Object key = (Object) iter.next();
  126. temp.remove(key);
  127. }
  128. //如果授权列表是空的,则返回0长度的集合
  129. if(temp.isEmpty()){
  130. return new ArrayList();
  131. }
  132. //现在已获得用户拥有读取权限的授权
  133. String searchModules = "select m from Module m where m.id in (:ids)";
  134. return getSession().createQuery(searchModules)
  135. .setParameterList("ids", temp.keySet())
  136. .list();
  137. }
  138. public List searchAclRecord(String principalType, int principalSn) {
  139. String sql = "select resourceSn,aclState&1,aclState&2," +
  140. "aclState&4,aclState&8,aclTriState " +
  141. "from T_ACL where principalType = '"+principalType + 
  142. "' and principalSn = "+principalSn;
  143. return getSession().createSQLQuery(sql).list();
  144. }
  145. //根据主体类型、主体标识和资源标识查找ACL实例
  146. private ACL findACL(String principalType, int principalSn,
  147. int resourceSn){
  148. return (ACL)getSession().createQuery(
  149. "select acl from ACL acl where acl.principalType = ? " +
  150. "and acl.principalSn = ? and acl.resourceSn = ?")
  151. .setParameter(0, principalType)
  152. .setParameter(1, principalSn)
  153. .setParameter(2, resourceSn)
  154. .uniqueResult();
  155. }
  156. //根据角色查找角色的授权列表,返回列表的元素是:ACL实例
  157. private List findRoleACLs(int roleId){
  158. String hql = "select acl from ACL acl where acl.principalType = ? " +
  159. "and acl.principalSn = ? ";
  160. return getHibernateTemplate().find(hql,new Object[]{ACL.TYPE_ROLE,roleId}); 
  161. }
  162. //根据用户查找直接授予用户的授权列表(注意:如果直接授予用户的授权是继承的话,则不应该包含在这个列表中),返回的列表元素是:ACL实例
  163. private List findUserACLs(int userId){
  164. String hql = "select acl from ACL acl where acl.principalType = ? " +
  165. "and acl.principalSn = ? and acl.aclTriState = 0";
  166. return getHibernateTemplate().find(hql, new Object[]{ACL.TYPE_USER,userId});
  167. }
  168. }