权限设计-递归取消授权?

系统初始:根机构、根用户超级管理员、所有的默认系统权限等。
用户登录系统,可选择登录个人后台,对自己权限内的菜单进行管理操作;也可选择自己某一个机构进入机构管理后台;(注:多机构和个人后台可在前端切换,不用重新登录)

机构菜单:部门、用户、角色、权限、Key管理、
个人后台菜单:权限管理、机构管理、key管理、

业务逻辑及设计思路:
1.主体:用户、机构、key同为主体,设计主体表,增加主体类型(用户 0,机构 1,Key 2);
2.主体之间可相互授权。注:机构可将权限、角色授权给其他机构、用户、key等;个人后台-个人权限管理,用户可将权限授权给机构、key(个人后台不存在角色概念)。
3.角色下有多个权限;权限可属于不同多个角色;
4.机构给其他机构授权角色,只能授权一级,被授权的主体不能将该角色再次授权,但可以使用该角色里含有的权限进行授权,或组成新的角色进行授权;
5.个人代理机构权限:机构给个人授权,是用户登录该机构的后台管理时,对该机构有管理的权限,而非个人可使用的权限;

操作授权功能:

  1. 机构下,给主体添加、取消多个权限;
  2. 机构下,给主体添加、取消多个角色;
  3. 代理机构权限:给用户添加、取消多个权限;(同1,用授权类型区分)
  4. 代理机构角色:给用户添加、取消多个角色;(同2,用授权类型区分)
  5. 角色添加、取消多个权限;
  6. 角色添加、取消多个主体;
  7. 权限添加、取消多个主体;

1.机构管理
2.用户管理
3.角色管理
4.权限管理
4.1机构权限管理
4.2个人权限管理
5.KEY管理
5.1个人Key管理
5.2机构Key管理

递归取消授权

v3.0
第二个版本中,有层级递归取消授权关系,容易造成死循环,且事务不能统一控制,废弃。

v1.0 初版:
机构、用户、角色、权限;
机构:机构树
用户可分别属于不同的机构;
机构:角色、权限(所有权限+其他机构授予的权限+其他用户授予的权限+其他机构授予角色带有的权限)
用户:权限、机构;

V2.0 修改递归方法:

~~// 权限是否授权给-其他主体||角色
    public void isGrantSubjectOfPerm(String subjectId,String pId,
                                     String grantSubjectId,String grantType){
        // 主体与权限关系--
        SubjectPermEntity subPermEntity = new SubjectPermEntity();
        subPermEntity.setId(subjectId,pId,grantSubjectId,grantType);
        // 删除主体与权限关系
        subjectPermRepo.delete(subPermEntity);
        //subjectPermEntities.add(subPermEntity);
        // 判断是否有角色带过来的权限?有:不删除 子级授权关系 和 本级角色关联关系;
        // 查询该权限是否有其他主体授权;
        long pSize = subjectRepo.getCountOfGrantPerm(subjectId,pId,grantSubjectId);
        // 查询该权限是否有其他主体授予角色带有的权限
        long pRSize = subjectRepo.getCountOfGrantRole(subjectId,pId,subjectId);
        if(pSize>0 || pRSize>0){
            // 有授权子级,不往下删除关系;
        }else{
            // 查询该权限 是否授权其他主体
            List<Object[]> subjectIdsOfPerm = subjectRepo.getSubjectIdsOfPerm(subjectId,pId);
            if(subjectIdsOfPerm!=null && subjectIdsOfPerm.size()>0){
                for(Object object:subjectIdsOfPerm){
                    Object[] oo = (Object[])object;
                    String subId = oo[0].toString();
                    String subGrantType = oo[1].toString();
                    // 递归-查询权限授权其他主体 subGrantType 授权类型
                    isGrantSubjectOfPerm(subId,pId,subjectId,subGrantType);
                }
            }
            // 查询该权限--是否关联其他角色
            List<String> roleIdsOfPerm = subjectRepo.getRoleIdsOfPerm(subjectId,pId);
            if(roleIdsOfPerm.size()>0){
                // 删除权限-角色关系
                for(String roleId:roleIdsOfPerm){
                    // 判断该角色是否授权给其他--主体
                    isGrantSubjectOfRole(pId,subjectId,roleId);
                }
            }
        }
    }
    // 查询该角色有无授权-给子机构
    public void isGrantSubjectOfRole(String pId,String grantSubjectId,String roleId){
        // 角色-权限关系
        RolePermEntity rolePermEntity = new RolePermEntity();
        rolePermEntity.setId(roleId,pId,grantSubjectId);
       // 删除-角色权限关系
        rolePermRepo.delete(rolePermEntity);
       // rolePermEntities.add(rolePermEntity);
        // 判断该角色有没有被授权给其他主体
        List<Object[]> subjectIds = subjectRepo.getSubjectIdsOfRole(grantSubjectId,roleId,pId);
        if(subjectIds!=null && subjectIds.size()>0){
            // 遍历:被授予的主体
          //  for(String subjectId:subjectIds){
            for(Object subjectObject:subjectIds){
                Object[] subObject = (Object[])subjectObject;
                // 被授予的主体id
                String subjectId = subObject[0].toString();
                String grantType = subObject[1].toString();
                // 删除角色--主体关系!!!!!!!2020-12-09 16:41:26
                SubjectRoleEntity subjectRoleEntity = new SubjectRoleEntity();
                subjectRoleEntity.setId(subjectId,roleId,grantSubjectId,grantType);
                subjectRoleRepo.delete(subjectRoleEntity);
                // 判断权限来源是角色附带的,还是直接授权的--?
                // 查询该权限是否有其他主体授权;
                long pSize = subjectRepo.getCountOfGrantPerm(subjectId,pId,grantSubjectId);
                // 查询该权限是否有其他主体授予角色带有的权限
                long pRSize = subjectRepo.getCountOfGrantRole(subjectId,pId,grantSubjectId);
                if(pSize>0 || pRSize>0){
                    // 有授权子级,不往下删除关系;
                    continue;
                }
                // 判断权限是否授权给---其他主体,
                List<Object[]> subjectIdsOfPerm = subjectRepo.getSubjectIdsOfPerm(subjectId,pId);
                if(subjectIdsOfPerm!=null && subjectIdsOfPerm.size()>0){
                    for(Object object:subjectIdsOfPerm){
                        Object[] oo = (Object[])object;
                        String subId = oo[0].toString();
                        String subGrantType = oo[1].toString();
                        // 递归-查询权限授权其他主体 subGrantType 授权类型
                        isGrantSubjectOfPerm(subId,pId,subjectId,subGrantType);
                    }
                }
                // 判断权限是否有关联角色? 有删除
                List<String> roleIdsOfPerm = subjectRepo.getRoleIdsOfPerm(subjectId,pId);
                if(roleIdsOfPerm.size()>0){
                    for(String childRoleId:roleIdsOfPerm){
                        isGrantSubjectOfRole(pId, subjectId, childRoleId);
                    }
                }
            }
        }
    }~~ 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值