二进制权限控制(二)
2015-06-25 10:30
232 查看
二进制权限控制(二)
标签(空格分隔): 未分类1、权限值的设定
用二进制来表示权限值应该是按位来设置,每个位占一个,表示一种权限或一个菜单,如:
0000000 1 表示拥有菜单编号为1的权限
000000 1 0 表示拥有菜单编号为2的权限
……
如张三拥有权限11(00001011),表示张三可以访问菜单编号为4、2、1的菜单。
2.权限的赋予(或操作):
如果张三的权限为11(00001011),现在要给他赋于菜单编号为3(00000100=4,从右往左数第三位为1)的权限,则进行‘或’操作,即:11 | 4 = 00001011 | 00000100 = 00001111 = 15
3.权限的回收(权限取反后“与”操作)
如要回收菜单编号为2(00000010)的权限,先对菜单权限取反:~2 = 11111101
与原来的权限进行“与”操作:00001111 & 11111101 = 00001101 = 13,即回收了张三菜单2的访问权限。
CREATE TABLE StatRole( RoleID INT, RoleName VARCHAR(100), --角色名称 MenuRights LVARCHAR(1000) DEFAULT '0', --菜单权限 ARights LVARCHAR(1000) DEFAULT '0', --添加权限 DRights LVARCHAR(1000) DEFAULT '0', --删除权限 ERights LVARCHAR(1000) DEFAULT '0', --修改权限 QRights LVARCHAR(1000) DEFAULT '0', --查询权限 XRights LVARCHAR(1000) DEFAULT '0', --备用权限x YRights LVARCHAR(1000) DEFAULT '0', --备用权限y ZRights LVARCHAR(1000) DEFAULT '0', --备用权限z ModifyTime CHAR(19) );
CREATE TABLE StatMenu( MenuID INT, PID INT, MenuType SMALLINT, MenuUrl CHAR(100), MenuName CHAR(100), ModifyTime CHAR(19) );
CREATE TABLE StatUser( UserName VARCHAR(10), UserCName VARCHAR(100), Password CHAR(32), ComCode CHAR(8), Roles LVARCHAR(1000), ModifyTime CHAR(19) );
package com.sinosoft.auth; import java.math.BigInteger; import java.util.List; import javax.annotation.Resource; import org.junit.Test; import com.sinosoft.BaseTest; import com.sinosoft.dao.DaoSupport; public class TestAuth extends BaseTest{ @Resource DaoSupport dao; @Test public void test() throws Exception { auth("1", "3", false, true, true, true); check("zhangsan"); revoke("1", "1", false, false, false, false); check("zhangsan"); } private void check(String userID) throws Exception{ List<StatMenu> list = (List<StatMenu>) dao.findForList("StatDTest.listMenu", null); StatUser user = (StatUser) dao.findForObject("StatDTest.getUser", userID); for(StatMenu menu : list){ StatMenu menu2 = getMenu(user.getRoles(), menu.getMenuID()); System.out.println("用户["+userID + "]"+(menu2.isAdd()?"有":"没有")+"[" + menu2.getMenuName() + "]的\"添加\"添加权限"); System.out.println("用户["+userID + "]"+(menu2.isDel()?"有":"没有")+"[" + menu2.getMenuName() + "]的\"删除\"添加权限"); System.out.println("用户["+userID + "]"+(menu2.isEdit()?"有":"没有")+"[" + menu2.getMenuName() + "]的\"修改\"添加权限"); System.out.println("用户["+userID + "]"+(menu2.isQuery()?"有":"没有")+"[" + menu2.getMenuName() + "]的\"查询\"添加权限"); } } public void auth(String roleID, String menuID, boolean ... op) throws Exception { StatRole role = (StatRole) dao.findForObject("StatDTest.getRole", roleID); BigInteger menu = new BigInteger("0").setBit(Integer.parseInt(menuID)); //赋操作权限 if(op[0]){ BigInteger aRights = new BigInteger(role.getaRights(), 32).or(menu); role.setaRights(aRights.toString(32)); } if(op[1]){ BigInteger dRights = new BigInteger(role.getdRights(), 32).or(menu); role.setdRights(dRights.toString(32)); } if(op[2]){ BigInteger eRights = new BigInteger(role.geteRights(), 32).or(menu); role.seteRights(eRights.toString(32)); } if(op[3]){ BigInteger qRights = new BigInteger(role.getqRights(), 32).or(menu); role.setqRights(qRights.toString(32)); } //赋菜单权限,进行“或”操作,如: 1 | 2 = 3, 00000001 | 00000010 = 00000011 BigInteger menuRights = new BigInteger(role.getMenuRights(), 32).or(menu); role.setMenuRights(menuRights.toString(32)); dao.update("StatDTest.updateRole", role); } public void revoke(String roleID, String menuID, boolean ... op) throws Exception { StatRole role = (StatRole) dao.findForObject("StatDTest.getRole", roleID); BigInteger menu = new BigInteger("0").setBit(Integer.parseInt(menuID)).not(); //赋操作权限 if(!op[0]){ BigInteger aRights = new BigInteger(role.getaRights(), 32).and(menu); role.setaRights(aRights.toString(32)); } if(!op[1]){ BigInteger dRights = new BigInteger(role.getdRights(), 32).and(menu); role.setdRights(dRights.toString(32)); } if(!op[2]){ BigInteger eRights = new BigInteger(role.geteRights(), 32).and(menu); role.seteRights(eRights.toString(32)); } if(!op[3]){ BigInteger qRights = new BigInteger(role.getqRights(), 32).and(menu); role.setqRights(qRights.toString(32)); } //回收菜单菜单权限,取反后进行“与”操作,如: 3 & (~1) = 2, 00000011 & 11111110 = 00000010 BigInteger menuRights = new BigInteger(role.getMenuRights(), 32).and(menu); role.setMenuRights(menuRights.toString(32)); dao.update("StatDTest.updateRole", role); } private StatMenu getMenu(String roleId, String menuID) throws Exception{ StatMenu menu = (StatMenu) dao.findForObject("StatDTest.getMenu", menuID); BigInteger bi = new BigInteger("0"); BigInteger need = bi.setBit(Integer.parseInt(menu.getMenuID())); StatRole role = (StatRole) dao.findForObject("StatDTest.getRole", roleId); BigInteger menuRights = new BigInteger(role.getMenuRights(),32); BigInteger needMenu = need.and(menuRights); BigInteger aRights = new BigInteger(role.getaRights(), 32); BigInteger dRights = new BigInteger(role.getdRights(), 32); BigInteger eRights = new BigInteger(role.geteRights(), 32); BigInteger qRights = new BigInteger(role.getqRights(), 32); menu.setAdd(needMenu.and(aRights).intValue() != 0); menu.setDel(needMenu.and(dRights).intValue() != 0); menu.setEdit(needMenu.and(eRights).intValue() != 0); menu.setQuery(needMenu.and(qRights).intValue() != 0); return menu; } }
相关文章推荐
- Android字体Font相关知识
- 【Leetcode】【Medium】Simplify Path
- 解决Ecshop因为动态ip问题登录后台自动退出
- yun
- 第16周周四:GUI编程及文件对话框的使用 项目一:文件及选择
- PATBasic——1023. 组个最小数 (20)
- JQuery实现鼠标移动图片显示描述层的方法
- android 安装新的sdk后,R文件不会自动生成问题
- LTE定位技术及测试解决方案设计
- Binary Tree Preorder Traversal
- 网线传输距离之学问
- 【Unity基础知识之二】支持iOS架构 armv6 armv7 armv7s arm64
- pip报ssl错误解决
- android 保存bitmap到SD卡
- 区别mysql的多表查询和连接查询
- Node.js中的process.nextTick使用实例
- PHP设计模式之调解者模式
- 07-排序2. Insert or Merge (25)
- iOS 常见小问题
- 电子书下载