RBAC(基于角色的访问控制)的实现

/**
  * 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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章