小型系统的权限设计--基于常量0x设计

关于常量0x定义

在阅读源代码的时候,我们经常看到如下定义

    public static final int ORDERED    = 0x00000010;

    public static final int DISTINCT   = 0x00000001;

    public static final int SORTED     = 0x00000004;

    public static final int SIZED      = 0x00000040;

    public static final int NONNULL    = 0x00000100;

    public static final int IMMUTABLE  = 0x00000400;

这个和我们定义成其他数字有什么区别呢

特殊发现

当我看到了下面这行代码,我突然领悟到了其中的精髓

int SPLITERATOR_CHARACTERISTICS = Spliterator.SIZED | Spliterator.SUBSIZED | Spliterator.ORDERED;

SPLITERATOR_CHARACTERISTICS变量是其他三个常量的和

解释其中关系

基本定义

int CONSTANT_1 = 0x00000001;  //二进制最后八位相当于0000 0001
int CONSTANT_2 = 0x00000002;  //二进制最后八位相当于0000 0010
int CONSTANT_3 = 0x00000004;  //二进制最后八位相当于0000 0100
int CONSTANT_4 = 0x00000008;  //二进制最后八位相当于0000 1000

复合定义

int CONSTANT_1_2 = CONSTANT_1 | CONSTANT_2;

//二进制最后八位相当于   CONSTANT_1   0000 0001
//二进制最后八位相当于   CONSTANT_2   0000 0010
//-----------     运算(或)        | ---------
//二进制最后八位相当于 CONSTANT_1_2   0000 0011

判断常量CONSTANT_1_2 是否包含 CONSTANT_1

//可进行如下运算
(CONSTANT_1_2 & CONSTANT_1) == CONSTANT_1
/**
 * 返回true代表包含
 * 返回false代表不包含
 */

基于以上运行,我们可以设计出一套简单的权限系统

这里我们选则int类型定义(int为32位,说明我们最多定义出32权限,每个权限只能有一位为1,其他都未0)

权限设计实现

package test.utils;

import java.util.Objects;

/**
 * 原定义,int类型可以定义32变量,基本原含义<blockquote><pre>
 * int CONSTANT_1 = 0x00000001; </pre></blockquote>
 * 
 * 组合定义 <blockquote> <pre>int CONSTANT_1_2 = CONSTANT_1 | CONSTANT_2; </pre></blockquote>
 * 
 * @author it
 */
public interface Entity {
    /** 原定义 */

    /** {@literal 添加} */
    int ADD = 0x00000001;
    /** {@literal 删除} */
    int DELETE = 0x00000002;
    /** {@literal 更新} */
    int UPDATE = 0x00000004;
    /** {@literal 查询} */
    int QUERY = 0x00000008;

    /** {@literal 登录} */
    int LOGIN = 0x00000010;
    /** {@literal 注销} */
    int LOGOUT = 0x00000020;
    /** {@literal 描述7} */
    int BAK = 0x00000040;
    /** {@literal 描述8} */
    int APP = 0x00000080;

    /** 组合定义 */

    /** {@literal ROOT管理权限} */
    int ROOT = ADD | DELETE | UPDATE | QUERY | LOGIN | LOGOUT | BAK | APP;
    //或者  int ROOT = 0xFFFFFFFF;
    /**  {@literal 浏览者权限}  */
    int NORMAL = QUERY | LOGIN | LOGOUT;
    /**  {@literal 开发者权限}  */
    int DEV = ADD | DELETE | UPDATE | QUERY  | LOGIN | LOGOUT;

    /**
     * 判断是否具有权限
     * 
     * @param composite
     * @param primative
     */
    static boolean hasPrivilege(final int composite, final int primative) {
        Objects.requireNonNull(composite, "变量1不能为空");
        Objects.requireNonNull(primative, "变量2不能为空");
        return (composite & primative) == primative;
    }
}

测试

package test.utils;

/**
 * <p>测试一下</p>
 * 
 * 这样设计出来的权限代码及其美观,如果是将权限保存到数据库,<b>不管具有多少权限,最终都是一个int数据而已,而且具有一定的安全性</b>
 * 
 * @author it
 */
public class TestPrivilege {

    public static void main(String[] args) {
        //测试管理员是否具备备份权限
        boolean flag1 = ConstantDefine.isConstain(Entity.ROOT, Entity.BAK);
        System.err.println(Entity.ROOT + " " + flag1);
        //测试开发者是否具备备份权限
        boolean flag2 = ConstantDefine.isConstain(Entity.DEV, Entity.BAK);
        System.err.println(Entity.DEV + " " + flag2);
        //测试浏览者是否具有浏览权限
        boolean flag3 = ConstantDefine.isConstain(Entity.NORMAL, Entity.QUERY);
        System.err.println(Entity.NORMAL + " " + flag3);
    }

}

测试结果

255 true
63 false
56 true

实际应用

当我们上传一个文件时候,可能需要检测文件是否重复,是否数据错误,xx业务校验

我们可以用以上定义

猜你喜欢

转载自blog.csdn.net/dengjili/article/details/81394424