1、 用户(User)可以拥有多个角色(Role),角色可以被分配给多个用户
2、 权限的意思就是对某个资源的某个操作,现在规定:
a) 所谓资源,即系统的模块
b) 所谓操作,包括:增加、删除、修改、查询等操作
3、 权限管理系统的总体功能分为:授权与认证
4、 授权,指将权限授予角色或用户
a) 如果用户A拥有角色B、角色C,那么,缺省的情况下,用户A将拥有被分配给角色B和角色C的所有权限(即默认情况下,用户A继承其拥有的角色所具有的所有权限)
b) 如果用户拥有多个角色,那么用户的权限是这些角色权限的合集
c) 如果用户拥有多个角色,而且角色之间的授权有冲突(比如对同一个资源的同一个操作,一个角色为“允许”,另外一个角色为“不允许”),将以优先级别高的角色为准(所谓优先级别,也就是对于这个用户所拥有的角色而言,是有顺序的,同一个角色在不同的用户那里可能拥有不同的优先级)
d) 除了可以对角色进行授权外,也可以针对用户进行授权,也就是说,将权限授予用户。针对某个资源的所有操作,我们可以设置这些权限对用户来说是“继承”或“不继承”
i. 继承:意思是这些权限将使用其(即用户)所拥有的角色的权限,而不使用其(即用户)单独设置的权限
ii. 不继承:意思是这些权限将使用其单独设置的权限,而不使用其所拥有的角色的权限
5、 认证,指用户访问资源的某些操作时,根据授权,判断是否允许用户的访问
a) 在用户访问的时候,需要进行即时的判断(是否有权访问)
b) 应该提供查询的功能,可以查询某个用户所拥有的所有权限
总体上,可分为模块管理、角色管理和用户管理模块:
二:
创建 一个ACL(权限控制列表)类--权限管理的核心
这个类的一个实例表示它的某个用户或某个角色对于某个模块的授权情况(授权状态)
注意:是某个用户或某个角色对于某个模块
public class ACL {
//表示主体部分为角色
public static final String TYPE_ROLE = "Role";
//表示主体部分为用户
public static final String TYPE_USRE = "User";
//表示授权允许
public static final int ACL_YES = 1;
//表示授权不允许
public static final int ACL_NO = 0;
//表示授权不确定(没有给用户单独授权,使用的是角色的权限,暂时不确定)
public static final int ACL_NEUTRAL = -1;
/**
* @hibernate.id generator-class="native"
*/
private int id;
/**
* @hibernate.property(主体类型--用户或角色)
*/
private String mainType;
/**
* @hibernate.property(主体的标示,如果主体类型是用户,那么主体标示就是用户的Id)
*/
private int mainId;
/**
* @hibernate.property(模块Id)
*/
private int moduleId;
/**
* @hibernate.property(授权状态,用其后四位来表示CIUD操作)
*/
private int aclState;
/**
* @hibernate.property(0表示不继承,1表示继承)
*/
private int extendState;
对应的get()set()方法(省略了)
/**
* 设置aclState授权状态
* @param permission(取值0123)
* @param yes(是否允许)
*/
public voidsetPermission(int permission,booleanyes){
int temp = 1;
temp = temp << permission;
if(yes){
aclState = aclState | temp;
}else{
temp = ~temp;
aclState = aclState & temp;
}
}
/**
* 获取是否可以操作模块的值ACL_YES=1可以 ACL_NO=0不可以
* @param permission
* @return
*/
public int getPermission(intpermission){
if(extendState== 1){
return ACL_NEUTRAL;
}
int temp = 1;
temp <<= permission;
temp &=aclState;
//(temp > 0)就是DUIC都不是0000
if(temp > 0){
returnACL_YES;
}else{
returnACL_NO;
}
}
三:
如果extendsState为1则actState无效(因为aclState是user自己的),它将使用role的权限
表中表示user5对modu10继承对module11不继承