oa_08


创建AclManager接口,并实现
- 理解权限管理子系统与其它系统之间的交互过程
- 理解权限管理子系统的具体实现


package com.bjsxt.oa.manager.impl;

import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;

import com.bjsxt.oa.manager.AclManager;
import com.bjsxt.oa.manager.Permission;
import com.bjsxt.oa.model.ACL;

public class AclManagerImpl extends AbstractManager implements AclManager {

	public void addOrUpdateExtends(int userId, int moduleId, boolean yes) {
		//查询ACL对象
		ACL acl = findACL(ACL.TYPE_USER, userId, moduleId);
		if(acl != null){
			acl.setExtends(yes);
			getHibernateTemplate().update(acl);
		}else{
			acl = new ACL();
			acl.setPrincipalType(ACL.TYPE_USER);
			acl.setPrincipalId(userId);
			acl.setModuleId(moduleId);
			acl.setExtends(yes);
			getHibernateTemplate().save(acl);
		}
	}

	public void addOrUpdatePermission(String principalType, int principalId,
			int moduleId, int permission, boolean yes) {
		
		//查询ACL对象
		ACL acl = findACL(principalType, principalId, moduleId);
		
		if(acl != null){
			//更新aclState的值
			acl.setPermission(permission, yes);
			getHibernateTemplate().update(acl);
		}else{
			acl = new ACL();
			acl.setPrincipalType(principalType);
			acl.setPrincipalId(principalId);
			acl.setModuleId(moduleId);
			acl.setPermission(permission, yes);
			getHibernateTemplate().save(acl);
		}
		
	}

	public void delPermission(String principalType, int principalId,
			int moduleId) {
		//查询ACL对象
		ACL acl = findACL(principalType, principalId, moduleId);
		if(acl != null){
			getHibernateTemplate().delete(acl);
		}
	}

	public boolean hasPermission(int userId, int moduleId, int permission) {
		//根据用户标识和模块标识查找授权记录
		ACL acl = findACL(ACL.TYPE_USER, userId, moduleId);
		if(acl != null){
			int yesOrNo = acl.getPermission(permission);
			if(yesOrNo != ACL.ACL_NEUTRAL){
				return yesOrNo == ACL.ACL_YES ? true : false;
			}
		}
		
		//继续查找用户拥有的角色的授权
		//查找用户拥有的角色,并按优先级从高到低排序
		String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
				"where u.id = ? order by ur.orderNo";
		List roleIds = getHibernateTemplate().find(hql,userId);
		for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) {
			Integer rid = (Integer) iterator.next();
			acl = findACL(ACL.TYPE_ROLE, rid, moduleId);
			if(acl != null){
				return acl.getPermission(permission) == ACL.ACL_YES ? true : false;
			}
		}
		
		return false;
	}

	public List searchModules(int userId) {
		//查询用户拥有的角色列表,并按优先级从低到高排序
		String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u " +
			"where u.id = ? order by ur.orderNo desc";
		List roleIds = getHibernateTemplate().find(hql,userId);
		Map temp = new HashMap();
		for (Iterator iterator = roleIds.iterator(); iterator.hasNext();) {
			Integer rid = (Integer) iterator.next();
			List acls = findRoleAcls(rid);
			for (Iterator iterator2 = acls.iterator(); iterator2.hasNext();) {
				ACL acl = (ACL) iterator2.next();
				temp.put(acl.getModuleId(), acl);
			}
		}
		
		//查询针对用户的有效的授权列表
		List acls = findUserAcls(userId);
		for (Iterator iterator = acls.iterator(); iterator.hasNext();) {
			ACL acl = (ACL) iterator.next();
			temp.put(acl.getModuleId(), acl);
		}
		
		//去掉那些没有读取权限的acl对象
		Set entries = temp.entrySet();
		for (Iterator iterator = entries.iterator(); iterator.hasNext();) {
			Map.Entry entry = (Map.Entry) iterator.next();
			ACL acl = (ACL)entry.getValue();
			
			//如果没有读取权限,都应该从最终的授权列表中去除
			if(acl.getPermission(Permission.READ) != ACL.ACL_YES){
				iterator.remove();
			}
		}
		
		//最后,得到拥有读取权限的授权列表
		Set moduleIds = temp.keySet();
		
		if(moduleIds.isEmpty()){
			return null;
		}
		
		//得到拥有读取权限的模块列表
		hql = "select m from Module m where m.id in (:ids) order by m.orderNo";
		
		return getSession().createQuery(hql)
					.setParameterList("ids", moduleIds) //moduleIds集合不能为空
					.list();
		
	}
	
	private ACL findACL(String principalType,int principalId,int moduleId){
		String hql = "select acl from ACL acl where acl.principalType = ? and " +
				"acl.principalId = ? and acl.moduleId = ?";
		return (ACL)getSession().createQuery(hql)
					.setParameter(0, principalType)
					.setParameter(1, principalId)
					.setParameter(2, moduleId)
					.uniqueResult();
	}
	
	private List findRoleAcls(int roleId){
		String hql = "select acl from ACL acl where acl.principalType = ? " +
				"and acl.principalId = ?";
		return getHibernateTemplate().find(hql, new Object[]{ACL.TYPE_ROLE,roleId});
	}
	
	private List findUserAcls(int userId){
		String hql = "select acl from ACL acl where acl.principalType = ?" +
				" and acl.principalId = ? and acl.aclTriState = ?";
		return getHibernateTemplate().find(hql, new Object[]{ACL.TYPE_USER,userId,ACL.ACL_TRI_STATE_UNEXTENDS});
	}

}



package com.bjsxt.oa.model;

import java.util.Set;


/**
 * 
 * @author Administrator
 * @hibernate.class table="T_Module"
 */
public class Module {
	
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	
	/**
	 * @hibernate.property
	 */
	private String name;
	
	/**
	 * @hibernate.property
	 */
	private String url;
	
	/**
	 * @hibernate.property unique="true"
	 */
	private String sn;
	
	/**
	 * @hibernate.property
	 */
	private int orderNo;
	
	/**
	 * @hibernate.many-to-one column="pid"
	 */
	private Module parent;
	
	/**
	 * @hibernate.set lazy="extra" inverse="true"
	 * @hibernate.key column="pid"
	 * @hibernate.one-to-many class="com.bjsxt.oa.model.Module"
	 */
	private Set children;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getUrl() {
		return url;
	}
	public void setUrl(String url) {
		this.url = url;
	}
	public String getSn() {
		return sn;
	}
	public void setSn(String sn) {
		this.sn = sn;
	}
	public int getOrderNo() {
		return orderNo;
	}
	public void setOrderNo(int orderNo) {
		this.orderNo = orderNo;
	}
	public Module getParent() {
		return parent;
	}
	public void setParent(Module parent) {
		this.parent = parent;
	}
	public Set getChildren() {
		return children;
	}
	public void setChildren(Set children) {
		this.children = children;
	}
}



package com.bjsxt.oa.model;

/**
 * 
 * @author Administrator
 * @hibernate.class table="T_ACL"
 */
public class ACL {
	
	public static final String TYPE_ROLE = "Role";
	public static final String TYPE_USER = "User";
	
	/**
	 * 表示本授权记录无效/即继承其角色的授权
	 */
	public static final int ACL_TRI_STATE_EXTENDS = 0xFFFFFFFF;
	
	/**
	 * 表示本授权记录有效/即覆盖了其角色的授权定义
	 */
	public static final int ACL_TRI_STATE_UNEXTENDS = 0;
	
	/**
	 * 授权允许
	 */
	public static final int ACL_YES = 1;
	
	/**
	 * 授权不允许
	 */
	public static final int ACL_NO = 0;
	
	/**
	 * 授权不确定
	 */
	public static final int ACL_NEUTRAL = -1;
	
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	
	/**
	 * @hibernate.property
	 */
	private String principalType;
	
	/**
	 * @hibernate.property
	 */
	private int principalId;
	
	/**
	 * @hibernate.property
	 */
	private int moduleId;
	
	/**
	 * @hibernate.property
	 */
	private int aclState;
	
	/**
	 * @hibernate.property
	 */
	private int aclTriState;
	
	public void setPermission(int permission,boolean yes){
		int temp = 1;
		temp = temp << permission;
		if(yes){
			aclState |= temp;
		}else{
			aclState &= ~temp;
		}
	}
	
	public int getPermission(int permission){
		if(aclTriState == ACL_TRI_STATE_EXTENDS){
			return ACL.ACL_NEUTRAL;
		}
		
		int temp = 1;
		temp = temp << permission;
		temp = aclState & temp;
		if(temp != 0){
			return ACL_YES;
		}
		
		return ACL_NO;
	}
	
	public void setExtends(boolean yes){
		if(yes){
			aclTriState = ACL_TRI_STATE_EXTENDS;
		}else{
			aclTriState = ACL_TRI_STATE_UNEXTENDS;
		}
	}
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getPrincipalType() {
		return principalType;
	}
	public void setPrincipalType(String principalType) {
		this.principalType = principalType;
	}
	public int getPrincipalId() {
		return principalId;
	}
	public void setPrincipalId(int principalId) {
		this.principalId = principalId;
	}
	public int getModuleId() {
		return moduleId;
	}
	public void setModuleId(int moduleId) {
		this.moduleId = moduleId;
	}
	public int getAclState() {
		return aclState;
	}
	public void setAclState(int aclState) {
		this.aclState = aclState;
	}
	public int getAclTriState() {
		return aclTriState;
	}
	public void setAclTriState(int aclTriState) {
		this.aclTriState = aclTriState;
	}
}



package com.bjsxt.oa.model;

/**
 * 
 * @author Administrator
 * @hibernate.class table="T_Role"
 */
public class Role {
	
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	
	/**
	 * @hibernate.property
	 */
	private String name;
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
}



package com.bjsxt.oa.model;

import java.util.Date;

/**
 * 
 * @author Administrator
 * @hibernate.class table="T_User"
 */
public class User {
	
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	
	/**
	 * @hibernate.property not-null="true" unique="true"
	 */
	private String username;
	
	/**
	 * @hibernate.property not-null="true"
	 */
	private String password;
	
	/**
	 * @hibernate.property
	 */
	private Date expireTime;
	
	/**
	 * @hibernate.property
	 */
	private Date createTime;
	
	/**
	 * @hibernate.many-to-one unique="true"
	 */
	private Person person;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public Date getExpireTime() {
		return expireTime;
	}
	public void setExpireTime(Date expireTime) {
		this.expireTime = expireTime;
	}
	public Date getCreateTime() {
		return createTime;
	}
	public void setCreateTime(Date createTime) {
		this.createTime = createTime;
	}
	public Person getPerson() {
		return person;
	}
	public void setPerson(Person person) {
		this.person = person;
	}
}



package com.bjsxt.oa.model;

/**
 * 
 * @author Administrator
 * @hibernate.class table="T_UsersRoles"
 */
public class UsersRoles {
	
	/**
	 * @hibernate.id generator-class="native"
	 */
	private int id;
	
	/**
	 * @hibernate.many-to-one
	 */
	private Role role;
	
	/**
	 * @hibernate.many-to-one
	 */
	private User user;
	
	/**
	 * @hibernate.property
	 */
	private int orderNo;
	
	public int getId() {
		return id;
	}
	public void setId(int id) {
		this.id = id;
	}
	public Role getRole() {
		return role;
	}
	public void setRole(Role role) {
		this.role = role;
	}
	public User getUser() {
		return user;
	}
	public void setUser(User user) {
		this.user = user;
	}
	public int getOrderNo() {
		return orderNo;
	}
	public void setOrderNo(int orderNo) {
		this.orderNo = orderNo;
	}
}

你可能感兴趣的:(Hibernate)