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;
}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值