二进制权限
- 表设计:
- 用户表
基本表中文名称:用户表 |
||||
基本表英文名称:sys_user |
||||
说明:用户表 |
||||
英文字段名 |
中文字段名 |
数据类型 |
长度 |
说明 |
id |
主键ID |
varchar |
32 |
唯一不能为空 |
username |
用户名 |
varchar |
20 |
唯一不能为空 |
password |
密码 |
varchar |
50 |
MD5加密 |
name |
姓名 |
varchar |
50 |
|
phone |
手机 |
varchar |
50 |
|
|
邮箱 |
varchar |
50 |
|
role_id |
角色 |
varchar |
32 |
|
logoimg |
企业图片 |
varchar |
100 |
路径 |
create_time |
创建时间 |
datetime |
|
|
update_time |
修改时间 |
datetime |
|
|
- 角色表
基本表中文名称:角色表 |
||||
基本表英文名称: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 |
|
- 菜单(权限)表
基本表中文名称:菜单(权限)表 |
||||
基本表英文名称: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; } |
- 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); |
- 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; }
} |
- 代码校验权限
- 前端jsp校验
<c:if test="${QX.edit == 1}"> <a >修改</a> </c:if> |
- 后台java校验
//校验权限(参数:request、当前目录url,权限名称) if(!Jurisdiction.buttonJurisdiction(this.getRequest(),menuUrl, "add")){return null;}
|