/** * 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; } ------------------------------------------------------------------------------------------- WebOA系统权限管理中设置CRUD及其相关的思想 对某个模块的权限主要包括以下四种操作: C----------Create添加 R----------Read读取 U----------Update更新(修改) D----------Delete删除 权限管理模块中,这四个操作是由一个叫做Permission的类来表示的,它的属性只有由四个已定义好的常量 CREATE = 0 READ = 1 UPDATE = 2 DELETE = 3 下面主要是关于如何设置这四种操作的说明。 阐述几个变量的含义: aclState-----表示授权状态,一个整型的最后四位表示,即含有哪几种操作的整形数值,存储在数据库中为32bit的整型变量 【由1、2、4、8四个数字或他们某几个的和组成,可能的值有1~15】 permission-----CRUD操作,只能取值0、1、2、3其中之一 aclTriState-----继承的状态,0表示不继承,-1表示表示继承 【由于授权包括直接给用户授权和给角色授权,不继承表示直接授权、继承则表示用户拥有某些角色的授权】 ACL_YES-----授权允许 ACL_NO-----授权不允许 ACL_NEUTRAL-----授权不确定 【注:授权允许与否是指aclState的值中是否含有某种操作permission(CRUD)】 用于设置权限的ACL.java(访问控制列表Access Control List)类中的主要方法 /** * acl实例跟主体和资源关联(实际上就是设置aclState的值) * 针对此实例进行授权:某种操作是否允许 * @param permission 只可以取值0,1,2,3 * @param yes true表示允许,false表示不允许(添加还是不添加这其中某个操作C/R/U/D) */ public void setPermission(int permission, boolean yes){ int tmp = 1; tmp = tmp << permission; if(yes){ aclState |= tmp; }else{ aclState &= ~tmp; } } /** * 获得ACL授权(根据permission判断aclState是否含有某个操作C/R/U/D) * @param permission C/R/U/D权限 * @return 授权标识:允许/不允许/不确定 */ public int getPermission(int permission){ //如果继承(-1),则返回不确定的授权信息 if(aclTriState == 0xFFFFFFFF) { return ACL_NEUTRAL; } int tmp = 1; tmp = tmp << permission; tmp &= aclState; if(tmp != 0) { return ACL_YES; } return ACL_NO; } /** * 设置本授权是否是继承的 * @param yes true表示继承,false表示不继承 */ public void setExtends(boolean yes){ if(yes){ aclTriState = 0xFFFFFFFF; }else{ aclTriState = 0; } } 分别解释上面三个方法 1、setPermission(int permission, boolean yes)设置操作是否允许 即将传入的permission设置到aclState的值中:添加某操作还是去除某操作。 定义临时变量tmp=1,然后tmp左移permission位(0、1、2、3位) 添加的话:aclState |= tmp; 即aclState与tmp作或(|)运算并返回值 去除的话:aclState &= ~tmp; 即aclState与tmp取反后作与(&)运算并返回值 例如: 若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若要添加R(1) 1. tmp(0001)左移1位,即现在tmp为0010 2. aclState(1100)与tmp作或运算,即1100 | 0010 ,结果是1110,即为添加R操作后aclState的值了(十进制为13,加上了R操作) 若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若要去掉已有的U(2) 1. tmp(0001)左移2位,即现在tmp为0100 2. tmp取反后~tmp为1101,aclState(1100)与1011做和运算,即1100 & 1011 ,结果为1000,即为去掉了U操作aclState的值(十进制为8,去掉了U操作) 2、getPermission(int permission) 获得ACL授权 即根据permission判断aclState是否含有某个操作C/R/U/D),返回 允许/不允许/不确定 的整型值 1. 若aclTriState为-1,表示用户的授权时继承自角色的,故其是否含有permission操作不确定ACL_NEUTRAL; 2. 若aclTriState不为-1,表示用户的权限是直接授予的。定义临时变量tmp=1,将其左移permission位,并与aclState作与运算,判断其值是否为0:若不为0,则表示原aclState中含有传入的permission操作;若为0,则表示原aclState中不含有传入的permission操作。 例如: 若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若传入的permission为2(即判断是否含有U操作),且是继承的。 1. tmp(0001)左移2位,即现在tmp为0100 2. tmp与aclState(1100)作与运算,即1100 & 0100 , 结果为0100(十进制为4),不为0,故此断定:值为12的aclState必含有U(2)操作。 若原来aclState的值为12(二进制即位1100,含有U和D操作),现在若传入的permission为1(即判断是否含有R操作),且是继承的。 1.t mp(0001)左移1位,即现在tmp为0010 2.tmp与aclState(1100)作与运算,即1100 & 0010 , 结果为0000(十进制为0),为0,故此断定:值为12的aclState必不含有R(1)操作。 3、setExtends(boolean yes) 设置本授权是否是继承的 是继承-----将aclTriState设置为-1; 不继承-----将aclTriState设置为0。 ============================================================================================ T_MODULE表: 后台菜单树模块 ,id name url targ parentid T_ROLE: id name, T_ACL(ACCESS CONTROL LIST): id resourcesn(resource serialnumber)对应页面模块ID aclstate (拥有相对应模块的权限) ROLEID 角色 ID t_userrole id , roleid , userid t_user id , username, password, person , adminstate, delstate