关闭

Web OA系统 - 权限管理设计

标签: webdeleteaccess数据库list存储
738人阅读 评论(0) 收藏 举报
分类:

对某个模块的权限主要包括以下四种操作:

C----------Create添加

R----------Read读取

U----------Update更新(修改)

D----------Delete删除

权限管理模块中,这四个操作是由一个叫做Permission的类来表示的,它的属性只有由四个已定义好的常量 CREATE = 0  READ = 1  UPDATE = 2  DELETE = 3

 

下面主要是关于如何设置这四种操作的说明。

阐述几个变量的含义:

aclState-----表示授权状态,一个整型的最后四位表示,即含有哪几种操作的整形数值,存储在数据库中为32bit的整型变量

【由1248四个数字或他们某几个的和组成,可能的值有1~15

permission-----CRUD操作,只能取值0123其中之一

aclTriState-----继承的状态,0表示不继承,-1表示表示继承

【由于授权包括直接给用户授权和给角色授权,不继承表示直接授权、继承则表示用户拥有某些角色的授权】

ACL_YES-----授权允许

ACL_NO-----授权不允许

ACL_NEUTRAL-----授权不确定

【注:授权允许与否是指aclState的值中是否含有某种操作permissionCRUD)】

 

用于设置权限的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;

       }

    }

分别解释上面三个方法

1setPermission(int permission, boolean yes)设置操作是否允许

即将传入的permission设置到aclState的值中:添加某操作还是去除某操作。

定义临时变量tmp=1,然后tmp左移permission位(0123位)

添加的话:aclState |= tmp;  aclStatetmp作或(|)运算并返回值

去除的话:aclState &= ~tmp;  aclStatetmp取反后作与(&)运算并返回值

例如:

若原来aclState的值为12(二进制即位1100,含有UD操作),现在若要添加R1

1.  tmp0001)左移1位,即现在tmp0010

2.  aclState1100)与tmp作或运算,即1100 | 0010 ,结果是1110,即为添加R操作后aclState的值了(十进制为13,加上了R操作)

若原来aclState的值为12(二进制即位1100,含有UD操作),现在若要去掉已有的U2

1.  tmp0001)左移2位,即现在tmp0100

2.  tmp取反后~tmp1101aclState1100)与1011做和运算,即1100 & 1011 ,结果为1000,即为去掉了U操作aclState的值(十进制为8,去掉了U操作)

2getPermission(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,含有UD操作),现在若传入的permission2(即判断是否含有U操作),且是继承的。

1.  tmp0001)左移2位,即现在tmp0100

2.  tmpaclState1100)作与运算,即1100 & 0100  结果为0100(十进制为4),不为0,故此断定:值为12aclState必含有U2)操作。

若原来aclState的值为12(二进制即位1100,含有UD操作),现在若传入的permission1(即判断是否含有R操作),且是继承的。

       1t mp0001)左移1位,即现在tmp0010

2tmpaclState1100)作与运算,即1100 & 0010  结果为0000(十进制为0),为0,故此断定:值为12aclState必不含有R1)操作。

3setExtends(boolean yes) 设置本授权是否是继承的

是继承-----aclTriState设置为-1

不继承-----aclTriState设置为0

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20004次
    • 积分:280
    • 等级:
    • 排名:千里之外
    • 原创:4篇
    • 转载:21篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论