二进制权限

  • 表设计:
  1. 用户表

基本表中文名称:用户表

基本表英文名称:sys_user

说明:用户表

英文字段名

中文字段名

数据类型

长度

说明

id

主键ID

varchar

32

唯一不能为空

username

用户名

varchar

20

唯一不能为空

password

密码

varchar

50

MD5加密

name

姓名

varchar

50

 

phone

手机

varchar

50

 

email

邮箱

varchar

50

 

role_id

角色

varchar

32

 

logoimg

企业图片

varchar

100

路径

create_time

创建时间

datetime

 

 

update_time

修改时间

datetime

 

 

  1. 角色表

基本表中文名称:角色表

基本表英文名称:sys_user

说明:这里加入角色组该你,把角色表做成一个自关联表

英文字段名

中文字段名

数据类型

长度

说明

id

主键ID

varchar

32

唯一不能为空

role_name

用户名

varchar

20

唯一不能为空

rights

菜单权限

varchar

255

 

pid

自关联id

varchar

50

 

add_qx

新增权限

varchar

255

 

edit_qx

修改权限

varchar

255

 

del_qx

删除权限

varchar

255

 

query_qx

查询权限

varchar

255

 

audit_qx

审计角色

varchar

255

 

by1_qx

备用权限字段1

varchar

255

 

by2_qx

备用权限字段2

varchar

255

 

by3_qx

备用权限字段3

varchar

255

 

 

  1. 菜单(权限)表

基本表中文名称:菜单(权限)表

基本表英文名称:sys_menu

说明:菜单权限表,是一个自关联表

英文字段名

中文字段名

数据类型

长度

说明

id

主键ID

varchar

32

唯一不能为空

menu_name

用户名

varchar

20

唯一不能为空

menu_url

菜单权限

varchar

255

 

pid

自关联id

varchar

50

 

menu_order

菜单顺序

varchar

255

 

  • 给角色赋予权限

二进制权限

二进制权限

 

//前台选择菜单,传入字符串拼接的menuIds,转换成二进制权限

BigInteger rights = RightsHelper.sumRights(Tools.str2StrArray(menuIds));

新增、编辑、删除、查询、审核、等都用这个方法

 

  • 登录获取菜单权限

获取当前角色

获取所有菜单

List<Menu> allmenuList = menuService.getAlllist();

获取角色中的菜单权限(rights)

String roleRights = role.getString("rights");

获取角色拥有的菜单列表(权限)

循环allmenuList,根据菜单id和roleRights判断,角色是否拥有此权限;

Boolean hasMenu = RightsHelper.testRights(roleRights, (int)menu.get("id"));

返回true的就是拥有权限的菜单,给菜单添加属性:hasMenu(Boolean,默认为false)

,拥有权限的设置为true;

 

//把所有菜单放入session

session.setAttribute(Const.SESSION_ALLMENULIST, zTreeNodes);

//按钮权限放到session中

session.setAttribute(Const.SESSION_QX, this.getUQX(session,role));     

 

/**

        * 获取角色按钮权限

        */

       public Map<String, String> getUQX(HttpSession session,PageData role){

              Map<String, String> map = new HashMap<String, String>();

              map.put("adds", StringTools.nullto0(role.getString("add_qx")));

              map.put("dels", StringTools.nullto0(role.getString("del_qx")));

              map.put("edits",StringTools.nullto0(role.getString("edit_qx")));

              map.put("chas", StringTools.nullto0(role.getString("cha_qx")));

              map.put("shs", StringTools.nullto0(role.getString("sh_qx")));

              map.put("by1s", StringTools.nullto0(role.getString("by1_qx")));

              map.put("by2s", StringTools.nullto0(role.getString("by2_qx")));

              map.put("by3s", StringTools.nullto0(role.getString("by3_qx")));

              return map;

       }

  1. RightsHelper工具类

package com.ztl.common;

 

import java.math.BigInteger;

 

/**

 * @author Administrator

 * 权限计算帮助类

 */

public class RightsHelper {

         /**

          * 利用BigInteger对权限进行2的权的和计算

          * @param rights int型权限编码数组

          * @return 2的权的和

          */

         public static BigInteger sumRights(int[] rights){

                   BigInteger num = new BigInteger("0");

                   for(int i=0; i<rights.length; i++){

                            num = num.setBit(rights[i]);

                   }

                   return num;

         }

         /**

          * 利用BigInteger对权限进行2的权的和计算

          * @param rights String型权限编码数组

          * @return 2的权的和

          */

         public static BigInteger sumRights(String[] rights){

                   BigInteger num = new BigInteger("0");

                   for(int i=0; i<rights.length; i++){

                            num = num.setBit(Integer.parseInt(rights[i]));

                            System.out.println(num);

                   }

                   return num;

         }

         public static void main(String[] args) {

                   String[] rights = new String[4];

                   for(int i=0;i<rights.length;i++){

                            rights[i]=(i+2)+"";

                   }

                   sumRights(rights);

         }

         /**

          * 测试是否具有指定编码的权限

          * @param sum

          * @param targetRights

          * @return

          */

         public static boolean testRights(BigInteger sum,int targetRights){

                   return sum.testBit(targetRights);

         }

        

         /**

          * 测试是否具有指定编码的权限

          * @param sum

          * @param targetRights

          * @return

          */

         public static boolean testRights(String sum,int targetRights){

                   if(Tools.isEmpty(sum))

                            return false;

                   return testRights(new BigInteger(sum),targetRights);

         }

        

         /**

          * 测试是否具有指定编码的权限

          * @param sum 总权限

          * @param targetRights

          * @return

          */

         public static boolean testRights(String sum,String targetRights){

                   if(Tools.isEmpty(sum))

                            return false;

                   return testRights(new BigInteger(sum),targetRights);

         }

        

         /**

          * 测试是否具有指定编码的权限

          * @param sum

          * @param targetRights

          * @return

          */

         public static boolean testRights(BigInteger sum,String targetRights){

                   return testRights(sum,Integer.parseInt(targetRights));

         }

}

 

  • 拦截器获取增删改查等权限

//获取当前访问路径

String path = request.getServletPath().substring(1, path.length());

//访问权限及初始化按钮权限(控制按钮的显示)

boolean b = Jurisdiction.hasJurisdiction(request, path);

 

  1. Jurisdiction工具类

 

package com.ztl.common;

 

import java.util.List;

import java.util.Map;

 

import javax.servlet.http.HttpServletRequest;

 

 

 

/**

 * 权限处理

 * @author:fh

*/

public class Jurisdiction {

 

              /**

               * 访问权限及初始化按钮权限(控制按钮的显示)

               * @param menuUrl  菜单路径

               * @return

               */

              public static boolean hasJurisdiction(HttpServletRequest request,String menuUrl){

                            //判断是否拥有当前点击菜单的权限(内部过滤,防止通过url进入跳过菜单权限)

                            /**

                             * 根据点击的菜单的xxx.do去菜单中的URL去匹配,当匹配到了此菜单,判断是否有此菜单的权限,没有的话跳转到404页面

                             * 根据按钮权限,授权按钮(当前点的菜单和角色中各按钮的权限匹对)

                             */

                            List<TreeModel> menuList = (List<TreeModel>)request.getSession().getAttribute(Const.SESSION_ALLMENULIST); //获取菜单列表

                            for(int i=0;i<menuList.size();i++){

                                          TreeModel treeModel = menuList.get(i);

                                          for(int j=0;j<treeModel.getNodes().size();j++){

                                                        TreeModel sunModel = treeModel.getNodes().get(j);

                                                        if(sunModel.getMenu_url().split(".action")[0].equals(menuUrl.split(".action")[0])){

                                                                      if(!sunModel.getChecked()){                                                        //判断有无此菜单权限

                                                                                    return false;

                                                                      }else{                                                                                                                                                                                                                        //按钮判断

                                                                                    Map<String, String> map = (Map<String, String>)request.getSession().getAttribute(Const.SESSION_QX);//按钮权限

                                                                                    String MENU_ID =  sunModel.getId();

                                                                                    String USERNAME = request.getSession().getAttribute(Const.USER_NAME).toString();          //获取当前登录者loginname

                                                                                    Boolean isAdmin = "admin".equals(USERNAME);

                                                                                    map.put("add", (RightsHelper.testRights(map.get("adds"), MENU_ID)) || isAdmin?"1":"0");

                                                                                    map.put("del", RightsHelper.testRights(map.get("dels"), MENU_ID) || isAdmin?"1":"0");

                                                                                    map.put("edit", RightsHelper.testRights(map.get("edits"), MENU_ID) || isAdmin?"1":"0");

                                                                                    map.put("cha", RightsHelper.testRights(map.get("chas"), MENU_ID) || isAdmin?"1":"0");

                                                                                    map.put("sh", RightsHelper.testRights(map.get("shs"), MENU_ID) || isAdmin?"1":"0");

                                                                                    map.put("by1", RightsHelper.testRights(map.get("by1s"), MENU_ID) || isAdmin?"1":"0");

                                                                                    map.put("b2", RightsHelper.testRights(map.get("by2s"), MENU_ID) || isAdmin?"1":"0");

                                                                                    map.put("by3", RightsHelper.testRights(map.get("by3s"), MENU_ID) || isAdmin?"1":"0");

                                                                                    request.getSession().setAttribute(Const.SESSION_QX, map);         //重新分配按钮权限

                                                                      }

                                                        }

                                          }

                            }

                            return true;

              }

             

              /**

               * 按钮权限(方法中校验)

               * @param menuUrl  菜单路径

               * @param type  类型(add、del、edit、cha)

               * @return

               */

              public static boolean buttonJurisdiction(HttpServletRequest request,String menuUrl, String type){

                            //判断是否拥有当前点击菜单的权限(内部过滤,防止通过url进入跳过菜单权限)

                            /**

                             * 根据点击的菜单的xxx.do去菜单中的URL去匹配,当匹配到了此菜单,判断是否有此菜单的权限,没有的话跳转到404页面

                             * 根据按钮权限,授权按钮(当前点的菜单和角色中各按钮的权限匹对)

                             */

                            List<TreeModel> menuList = (List<TreeModel>)request.getSession().getAttribute(Const.SESSION_ALLMENULIST); //获取菜单列表

                           

                            for(int i=0;i<menuList.size();i++){

                                          TreeModel treeModel = menuList.get(i);

                                          for(int j=0;j<treeModel.getNodes().size();j++){

                                                        TreeModel sunModel = treeModel.getNodes().get(j);

                                                        if(sunModel.getMenu_url().split(".action")[0].equals(menuUrl.split(".action")[0])){

                                                                      if(!sunModel.getChecked()){                                                        //判断有无此菜单权限

                                                                                    return false;

                                                                      }else{                                                                                                                                                                                                                        //按钮判断

                                                                                    Map<String, String> map = (Map<String, String>)request.getSession().getAttribute(Const.SESSION_QX);//按钮权限

                                                                                    String MENU_ID =  sunModel.getId();

                                                                                    String USERNAME = request.getSession().getAttribute(Const.USER_NAME).toString();          //获取当前登录者loginname

                                                                                    Boolean isAdmin = "admin".equals(USERNAME);

                                                                                    if("add".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("adds"), MENU_ID)) || isAdmin);

                                                                                    }else if("del".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("dels"), MENU_ID)) || isAdmin);

                                                                                    }else if("edit".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("edits"), MENU_ID)) || isAdmin);

                                                                                    }else if("cha".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("chas"), MENU_ID)) || isAdmin);

                                                                                    }else if("sh".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("shs"), MENU_ID)) || isAdmin);

                                                                                    }else if("by1".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("by1s"), MENU_ID)) || isAdmin);

                                                                                    }else if("by2".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("by2s"), MENU_ID)) || isAdmin);

                                                                                    }else if("by3".equals(type)){

                                                                                                  return ((RightsHelper.testRights(map.get("by3s"), MENU_ID)) || isAdmin);

                                                                                    }

                                                                      }

                                                        }

                                          }

                            }

                            return true;

              }

             

}

  • 代码校验权限
  1. 前端jsp校验

<c:if test="${QX.edit == 1}">

       <a >修改</a>

</c:if>

 

  1. 后台java校验

 

//校验权限(参数:request、当前目录url,权限名称)

if(!Jurisdiction.buttonJurisdiction(this.getRequest(),menuUrl, "add")){return null;}