基于动态树的权限管理


        实习 公司项目需要要求写一个基于动态树是的用户权限管理,说白了就是不同的用户对不同的树结构拥有不同的权限,基本思想是采用基于角色的访问控制模型(Role-Base Acess Control,RBAC)进行设计,也就是角色,用户,权限,当然也可以有组的概念,这里的动态树是指EXT中根据后台数据库中的的表记录动态生成的树结构,为了能够对每颗树节点(动态)的进行权限的分配,后台进行鉴权等,为了方面的达到上面的目的,使用了基于视图的访问控制模型(View-base Acess Control Model,VACM)是一种针对树型区域的访问控制模型,其标准已经被SNMPv3的安全模型所采纳,能够对树模型上的任意节点或子树配置访问权限。

首先就是对数据库的设计,在这之前先了解一下树的表结构

其中OID字段是采用的MIB(snmp)中的命名对树节点进行描述的一种方法比如(0)表示根节点,(0,1)表示他的一整个孩子,每个节点由其父节点到根节点所有id组成,这样每一个树节点就有唯一的OID来表示,并能清楚的知道父子之间的关系,大大的增加了鉴权的方便性。

接下来就是一些其他树结构在这里就不多说了设计截图给大家看看。

user表:


group表:


user_group表:


group_permission表:


treeoid表:


还有就是permission表:


它们之间的外键关系:



数据库就到这里,主要的代码就是鉴权,其他的如用户管理(增删改查),权限分配,角色分配等我想大家也很熟悉了,这里就贴出对动态树的鉴权代码:



public class TreeAuth {
	
	public  List<Tree> treeAuthority(List<Tree> trees,User user){
		
		List<Tree> allTrees = trees;
		List<Tree> myTrees = new ArrayList<Tree>();
		//首先在用户角色表中查角色iD
		UserGroupDAO userGroupDAO = new UserGroupDAO();
		GroupPermissionDAO groupPermissionDAO = new GroupPermissionDAO();
		PermissionDAO permissionDAO =  new PermissionDAO();
		TreeoidDAO treeoidDAO = new TreeoidDAO();
		
		List<UserGroup> userGroups = userGroupDAO.findByProperty("userid", user.getId());
		for (Iterator iterator = userGroups.iterator(); iterator.hasNext();) {
			UserGroup userGroup = (UserGroup) iterator.next();
			int roleId = userGroup.getRoleid();
			//根据roleId找到角色(可能多个所有用链表)
			List<GroupPermission> groupPermissions = groupPermissionDAO.findByRoleid(roleId);//根据roleId找到permissionId 找到对应的权限
			for (Iterator iterator2 = groupPermissions.iterator(); iterator2.hasNext();) {
				GroupPermission groupPermission = (GroupPermission) iterator2.next();
				int permissionId = groupPermission.getPermissionid();
				System.out.println(roleId+"对应的permissionId:"+permissionId);
				 Permission permission = permissionDAO.findById(permissionId);
				 List<Treeoid> treeOIDs = treeoidDAO.findByPermissionid(permissionId);
				 for (Iterator iterator3 = treeOIDs.iterator(); iterator3.hasNext();) {
					Treeoid treeoid = (Treeoid) iterator3.next();
					String oID = treeoid.getOid();
					for(Iterator<Tree> iterator4 = allTrees.iterator();iterator4.hasNext();){
						Tree tree = iterator4.next();
						String oid1 = dealString(tree.getOid());//处理一下字符串
						String oid2 = dealString(oID);
						if(oid1.contains(oid2)){//如果用户权限中有这个树就把加进去(包括他的子树)
							//permission.getInclude()== 1表示包括此子树 另外0表示不包括 这样可以实现一颗树下可不全能操作
							if(!myTrees.contains(tree)&&permission.getInclude()== 1){//避免对Tree对象重复存储,因为用户可能具有不同角色,不同的角色之间可能存在对相同树的操作造成树重复的储存
								if(permission.getType()==1){
									tree.setTypeString("可读");
								}
								if(permission.getType()==2){
									tree.setTypeString("可读/可写");
								}
								myTrees.add(tree);
								System.out.println("---"+tree.getText());
							}
							//当不包含时,但是因为前面的步奏已经包含进去了的,就删除
							if(myTrees.contains(tree)&&permission.getType()==0){
								myTrees.remove(tree);
							}
						}
					}
				}
			}
		}
		return myTrees;
	}
	
	
	/*
	 * 删除OID中的前后括号
	 */
	public  String dealString(String oid){
		String temp = oid;
		int start = 1;
		int end = temp.length()-1;
		return temp.substring(start, end);
	}

}

上面只是一个树的鉴权,看登陆用户是否对这个树有权限,就不在这里细说了

希望大家指正谢谢:



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值