关键字: 设计思想
人员管理
角色管理
模块管理
其实有这样一些概念:
主体:用户和角色可以称为主体。
资源:就是可以进行crud的对象。
权限:就是对资源的crud操作。
授权:就是对这种权限的分配。
认证:就是查询用户是否有权限。
用户和角色的关系是多对多,这共同组成了主体。
模块是资源。
主体和资源的纽带是ACL(访问控制列表),主体和ACL之间是多对多关系,资源和ACL之间也是多对多关系。ACL里面就记录了用户的权限。
在数据库上它就是一个中间表的作用。
授权是这样的:
授权分为两种:
角色授权
对角色统一授权,继承这种角色的用户就自动拥有该角色所拥有的权限,并且权限分有优先级,这样两种权限如果之间发生冲突则取高优级。
用户授权
对用户进行单独授权,这种情况必须在不继承角色的情况下才能生效,并且此时只使用单独授权的权限。
每一次授权都是针对特定模块,而不是所有。
搜索用户所有授权过程是这样的:
1、查询用户所有角色的权限,按优先给从低到高,有重复的可以以高优先级覆盖。(存入Map中,key是资源标识)
2、查询用户直接授予的权限。查询不继承的权限。
3、合并权限。
4、再从中选择具体的权限(crud)。
认证过程是这样的:
根据用户标识和资源标识查找ACL实例
有实例:
查看是否有确定授权
确定:返回授权
不确定(继承):查询用户拥有角色列表,根据角色标识和资源标识查找ACL实例(循环)
没有实例:
查询用户拥有角色列表,根据角色标识和资源标识查找ACL实例(循环)
一个 int 有32 位,用后4位表示CRUD 操作,位的取值1或0表示授权或不授权
/**
* acl实例跟主体和资源关联
* 针对此实例进行授权:某种操作是否允许
* @param permission 只可以取值0,1,2,3
* @param yes true表示允许,false表示不允许
*/
public void setPermission(int permission,boolean yes){
int tmp = 1;
//tmp的二进制形式向左移动permission个单位
//这样经过移动的结果会有四种情况: C:0001 R:0010 U:0100 D:1000
tmp = tmp << permission;
if(yes){
//如果是授权,则把原有的权限与当前的权限相加,二进制用"|"
aclState |= tmp;
}else{
//如果是减去授权,则当前传进来的权限取反,再与原有的权限"&"
aclState &= ~tmp;
}
}
/**
* 获得ACL授权(获得C/R/U/D的权限是否允许或是否确定)
* @param permission C/R/U/D权限
* @return 授权标识:允许/不允许/不确定
*/
public int getPermission(int permission){
//如果继承,则返回未定的授权信息
if(aclTriState == 0xFFFFFFFF){
return ACL_NEUTRAL;
}
int tmp = 1;
tmp = tmp << permission;
//只要C/R/U/D中不全部为没有权限(0000),那么与刚刚传入的权限相"&"是不会出现等于0的.
tmp &= aclState;
if(tmp != 0){
return ACL_YES;
}
return ACL_NO;
}
从你上面的意思看
0001为十进制的1:拥有C权限;
0010为十进制的2:拥有R权限;
0100为十进制的4:拥有U权限;
1000为十进制的8:拥有D权限;
也就是用最后四位来表示CRUD的权限,1表示允许,0表示不允许。
那么,
CRUD的权限就是1111,也就是十进制的15;
减少一个D操作也就是减少8,为7
如果再加上一个D操作,那么就加上8,又为15了.