`
xxp3369
  • 浏览: 151387 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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;
	}
}
分享到:
评论

相关推荐

    oa系统代码8

    从压缩包文件的名称"oa_gl_08"来看,这可能涉及到通达OA系统的“会计/财务”模块的第八个部分。会计模块通常包括账务处理、报表分析、费用报销、预算控制等功能,旨在帮助企业管理财务流程,提高财务管理的准确性和...

    SpringBoot JAVA 开源OA协同办公系统

    本项目自2020-08-17日起,为全面支持mysql8以上版本,Oracle,启用SpringBoot 2.3x的版本。支持jasperreport报表系统。 本项目权限管理可控制页面、接口、数据操作。 目前系统已全面支持国产达梦数据库8.0,人大...

    最新技术oa开发系统

    总之,【最新技术OA开发系统】利用了现代Web开发的最佳实践,结合VS08、Ajax、jQuery、Linq和Mvc,为企业打造了一个功能强大、易用且高效的办公自动化平台。对于开发者来说,深入理解和掌握这些技术,能够更好地利用...

    【高质量OA系统Axure原型】员工端OA办公系统移动端原型模板V1.2(功能齐全,小贵但值,不坑人).rp

    产品简介:本作品为【OA办公系统员工端高保真原型模板】配套的后台管理端原型模版,企业可通过该系统高效地处理办公行政人事等事务。管理端涵盖了工作台 、日程待办、组织、员工、考勤、薪酬、审批、招聘、绩效、...

    通达OA2010自动升级同步官方补丁-纯净完美版

    2、即时通讯服务版本:最新版本号 2010-12-08补丁 (永久解决即时通讯服务器程序IM突破30人,不限用户数,即时通讯服务所有功能均可正常使用。) 3、定时任务服务版本:最新版本号 2010-12-03补丁 4、邮件代理服务...

    通达OA2008源码2

    通达OA2008ADV源码 仅供学习参考,请勿用于商业用途,否则产生的后果自负.源码共分5份上传,(淘宝挂2万在卖的XX人真黑啊新!初期模仿是必不可少的,但最重要的依然是创新,可模仿的东西通常是廉价的^)^ 为钱途考虑,大家...

    好例子网_MVCOA核心架构

    【MVCOA核心架构】是基于Model-View-Controller(MVC)设计模式的一种扩展,主要应用于企业级的办公自动化(OA)系统开发。MVC模式是一种常见的软件设计模式,它将应用程序分为三个主要组件:模型(Model)、视图...

    人事OA管理系统

    人事管理OA系统 本案例开发环境: 数据库:Mysql IDE :STS3.0 JDk :1.7 Tomcat:7.0 本案例所使用技术: 1、struts2标签 2、jsp页面 3、SSH2 框架 目前完成功能: 1、用户登录判断权限 2、普通用户登录主页...

    带即时聊天工具的OA 功能全部开放

    2.还原数据库,SQLdata/ok2007-08-14.bak并添加访问用户. 我的设置为数据库名SSoa 登陆用户名:sa 密码:12311 3.修改sqlconn里面的相关数据库链接信息. 4.修改即时通[边缘特别版]\Server\Server.ini里的相关信息 ...

    08计算机OA项目实训方案.pdf

    《08计算机OA项目实训方案》是一个针对计算机专业学生的实践教学计划,旨在提升学生的综合技术应用能力和企业项目开发经验。实训项目以OA(Office Automation)办公系统为载体,让学生在有限的时间内体验真实的项目...

    公司帮手免费OA v2015.08.23.rar

    公司帮手免费OA v2015.08.23发布。 1、优化了系统首页的 展示方式。 2、优化了所有模块的展示方式。 3、优化了各个模块的搜索条件,使使用者可以更快捷的进行搜索。 4、优化了工作流部分内容。 5、优化了功能...

    php项目OA配套源码

    OA系统是现代企业提升效率、实现数字化管理的重要工具,它涵盖了工作流、文档管理、任务分配、会议安排等多个方面。08章配套源码意味着这是一个教学资源,用于帮助学习者理解PHP项目开发的基础和实践。 首先,我们...

    通达OA2010 3.6 110408 补丁(OA补丁+zcj+报表+IM+精灵+Zlchat补丁)

    2、即时通讯服务版本:最新版本号 2010-12-08补丁 (永久解决即时通讯服务器程序IM突破30人,不限用户数,即时通讯服务所有功能均可正常使用。) 3、定时任务服务版本:最新版本号 2010-12-03补丁 4、邮件代理服务...

    智能OA办公系统 SpringBoot JAVA 开源OA协同办公系统自研工作流引擎支持可视化表单设计与流程设计支技分布式部署

    本项目JDK8x64+SpringBoot+MyBatis+Redis+Durid+Beetl的框架组合的开源OA系统,自研工作流引擎,支持可视化表单设计与流程设计。支持分布式部署,支持文档全文检索,支持集群应用,支持私有化部署,支持钉钉微信,...

    web OA管理系统

    "OA-08-23"可能是系统的一个版本号或者特定日期的更新记录,具体含义需要进一步了解系统详情。在实际应用中,用户应定期更新系统至最新版本,以获取最新的功能和修复的安全漏洞。 综上所述,Web OA管理系统是现代...

    北大青鸟 Accp 5.0 电子课件 Y2 HR CRM OA B2C毕业设计项目开发(HR CRM OA B2C Project).part08.rar

    北大青鸟 Accp 5.0 电子课件 Y2 HR CRM OA B2C毕业设计项目开发(HR CRM OA B2C Project) 共计15个压缩包,需要全部下载才能解压.

    OA办公自动化管理系统详细设计说明书.doc

    OA 办公自动化管理系统详细设计说明书 OA 办公自动化管理系统是一种旨在提高办公效率和自动化办公流程的系统。该系统的设计目的是为了满足现代化办公的需求,提高办公效率,减少办公成本,提高员工的工作效率和满意...

    OA公文文档说明

    ### OA公文文档说明知识点详解 #### 一、公文管理概述 公文管理作为办公自动化(OA)系统中的核心模块之一,旨在提高组织内部文件处理的效率与规范性。主要包括发文管理和收文管理两大方面,并辅以公文处理情况...

    OA 飞思协同办公管理系统Coffice par1

    OA 飞思 协同办公管理系统 Coffice vs08下编译。功能不变。 请尊重原作者成果。

Global site tag (gtag.js) - Google Analytics