权限设计思路

首先统一模块名、方法名、命名空间。确定树节点中的模块名与管理的模块名保持一致。例如t_menunode与t_module中的url相同。

 

Uml类图:

 

a)        url:org!addOrg

b)        url:org!deleteOrg

c)        url:org!updateOrg

d)        url:org!findOrg

 

要做权限,首先弄清表结构。

 

对于实现如何登陆确定权限:

前提:创建单独类AuthInfo,用于存放用户所用的权限。类中字段有url、operator(对模块的操作码)、priority(优先级)

1、  登陆时查询目前登陆用户所拥有的所有的User_Role(中间表),遍历这些User_Role,每遍历一次得到一个角色,角色可以对多个模块操作,且与模块式多对多关系,可以得到中间表AccessControlList集合,再遍历每个AccessControlList,然后将信息放入AuthInfo中。然后依次放入一个Map中key为url(如role、module),value为AuthInfo。

代码如下:

Set<AccessControlList>accessControlLists = role.getAccessControlLists();

           for (Iterator iterator2 = accessControlLists.iterator();iterator2

                  .hasNext();) {

              AccessControlList acl = (AccessControlList) iterator2

                     .next();

              AuthInfo authInfo = new AuthInfo();

              authInfo.setUrl(acl.getModule().getUrl());

              authInfo.setOperator(acl.getOperatorCode());

              authInfo.setPriority(userRole.getPriority());

             

              AuthInfo authInfo2 = (AuthInfo) auth.get(acl.getModule().getUrl());

              if(authInfo2!=null){

                  if(authInfo.getPriority()<authInfo2.getPriority()){

                     auth.put(authInfo.getUrl(),authInfo);

                  }

              }else{

                  auth.put(authInfo.getUrl(),authInfo);

              }

              System.out.println();

        }

 

注意:有可能一个用户拥有多个角色,其中有两个角色对同一模块都有操作权限,此时需要比较优先级。

 

2、 上面的是通过角色查询拥有的操作权限,还有可能是直接授权,越过了角色,通常情况下我们认为直接授权的优先级最高,此时直接

Set<AccessControlList>accessControlLists = user.getAccessControlLists();

       for (Iterator iterator =accessControlLists.iterator();

3、  不在是通过角色得到accessControlLists对象,现在遍历这个便可得到用户直接授权,在将其放入AuthInfo中。然后依次放入一个Map中key为url(如role、module),value为AuthInfo。

 

 

4、  在登陆时完成以上操作后,将上边获取的Map放入session中,以便后来使用。

5、 在生成节点树的时候,首先获取全部的节点List,然后遍历。在遍历时取出url,以org为例,取出的父节点的url为org,对于的子节点为

a)        url:org!addOrg

b)        url:org!deleteOrg

c)        url:org!updateOrg

d)        url:org!findOrg

e)        这样,分开处理这两中情况,若为父节点,通过此url(Map中的key)得到对应的AuthInfo,若AuthInfo为空,说明此用户对此模块无权限操作,若不为空,将这个节点放入新的NewList。如果我子节点,此时的url为org!updateOrg这种类型,将此地址split,得到的String数组的第一个就为moduleName,后面为方法名,通过得到的moduleName做为Key,在session中的Map得到对应的AuthInfo,若为空,无权限,跳过。不为空,则许CRUD分别判断。将AuthInfo中的操作码与CREATERETRIVE、UPDATEDELETE分别与操作,若得到的值不为空则分别有权限操作这些节点,就放入新的NewList。最后将NewList返回生成树。

 

List list = new ArrayList<MenuNode>();

       if (pid==-1) {

           list = this.hibBaseDao.getRowsFileds("fromMenuNode m where m.parent.id is null  ", null   );

          

       }else{

          

           list = this.hibBaseDao.getRowsFileds("fromMenuNode m where m.parent.id=?",new Object[]{pid});

          

       }

       Map auth = AuthInfo.getAuth();

       List nlist = new ArrayList();

       for (Iterator iterator = list.iterator();iterator.hasNext();) {

           MenuNode menuNode = (MenuNode) iterator.next();

           String url = menuNode.getUrl();

           if(menuNode.getLeaf()==0){

              AuthInfo authInfo = (AuthInfo) auth.get(url);

             

              if(authInfo!=null){

                  nlist.add(menuNode);

              }

           }else{

              String[] actionMethod = url.split("!|/");

              String actionName = actionMethod[0];

              String methodName = actionMethod[1];

             

              AuthInfo authInfo = (AuthInfo) auth.get(actionName);

             

              if(authInfo!=null){

                 

                  if (methodName.contains("add")) {

                     if ((Operator.CREATE&authInfo.getOperator())!=0) {

                         nlist.add(menuNode);

                     }

                  }else if(methodName.contains("delete")){

                    

                     if ((Operator.DELETE&authInfo.getOperator())!=0) {

                         nlist.add(menuNode);

                     }

                    

                  }else if(methodName.contains("update")){

                    

                     if ((Operator.UPDATE&authInfo.getOperator())!=0) {

                         nlist.add(menuNode);

                     }

                    

                  }else{

                    

                     if ((Operator.RETRIVE&authInfo.getOperator())!=0) {

                         nlist.add(menuNode);

                     }

                  }

              }

           }

       }

       return  nlist;

    }

这样,权限树就生成了。

 

 

对于给角色授权,这些就是向对应的表中插入对应的值。此处说一下角色授权

 

角色授权就是给角色授予CRUD的某种操作。因为这个是需要三张表的,首先Role(角色)、AccessControlList(中间表)、Module(模块表),

此时要做的就是向AccessControlList表中插入对应数据,然后就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值