基于按位与的权限设计策略

可能用到的:转换为二进制Integer.toBinaryString(int i)

[size=medium]一、理论设计[/size]
该系统权限管理策略是基于按位运算处理权限的方法来实现的。首先将所有权限组成一个列表,并赋予某个不重复的整型值,例如:
操作 权限编号
——— ——
产品分类管理 0
部门设置 1
产品/原料信息 2
客户信息管理 3
仓库管理 4
…… ……
理论上可以有N个操作。这样,如果用户A有以下权限:
仓库管理
部门设置
则用户A的权限值power_value=2^4+2^1=18,化成二进制为10010。然后在根据公式:
Int result = power_value&((int)Math.pow(base,index));(注:Math.pow(2,4)表示2^4);
来判断是否有相关权限,如果result =base^index则说明有该权限。下面给出一个例子。
如果要验证用户A是否有仓库管理的权限,则可通过按位与来计算。
int result = power_value&((int)Math.pow(2,4));
即:10010
& 10000
——————
10000
得到的结果为result = 10000=2^4;即用户A有仓库管理的权限;
如果要验证用户A是否有产品/原料信息管理的权限,则:
int result = power_result&((int)Math.pow(2,2))
即:10010
& 00100
——————
00000
得到的结果为result = 00000!=2^2;即用户A没有产品/原料信息管理的权限。

[size=medium]二、权限的数据库设计[/size]
该权限控制策略要用至少3张数据库表来实现
表一:
权限资源表(poweraction):
名称 字段名 字段类型 是否为空 主外键
资源ID Id 自增 否 主键
资源url url Varchar(255) 否
资源名称 Action Varchar(255) 否
资源值 Value Int 否

表二

用户权限表(user_power):
名称 字段名 字段类型 是否为空 主外键
用户ID UserId Varchar(20) 否 外键
权限值 Power_value Int 否

你可能感兴趣的:(基于按位与的权限设计策略)