简单讲解下权限的设计方式,包含64位怎么对应或产生的:
比如:用户登录后有一个权限集合(集合里面的内容是什么),用户访问一个url等

解决方案 »

  1.   

        将具体每一个权限项的名称及其对应的URL绑定保存在一张表里面,然后在某个角色赋权限的时候就将对应的权限项值的集合保存到一个数组当中,分别将此数组的每个元素对64取模后保存在数据库中,这样在用户登录根据相应的角色取出这些数值的时候就可以作相反的运算即可得该用户时候具有相应的权限了。
       说不清楚
      

  2.   

    AccessUtil把系统所有的操作排队,小朋友,排排队,分果果。
    于是所有操作就一字排开。有多少操作呢?我们保守点估计,假设总共有64*64(=4096)这么多操作,一般都没有这么多的。
    好了,现在你面前就一排小朋友,有4096个小朋友,排了一条长长的队。每个小朋友手里拿了一个号,从1到4096。
    每个小朋友代表一个操作。
    假设小朋友的亲戚才可以把小朋友领走。
    那么如果你是一个用户,你要来领5号小朋友(你要做5号操作),你怎么办呢?
    你就跑到5号小朋友身边,看他认识你不?认识了,信任了,是他亲戚了,就把他领走。基于这个思路:
    我们做这样的事情:
    把操作一字排开,操作码为从1到4096。用位来存,即每个2进制位存一个操作。一个long是8个字节,也就是64个二进制位。
    所以4096个操作就需要64个long来表示。所以,你看到了一个64个元素的long数组。然后每个用户呢,他手里的一对操作也就对应到了每个二进制位上。比如在第5个位上他有这个权限,这个位上为1,否则为0;
    这样,每个用户一登录,就根据他的操作权限为他生成了一个他自己的long数组。放到内存中。
    当他要做某个操作时,比如5号操作,为 0001 0000,那么用用户手里的long数组与此操作进行“与”运算。其他位“与”0肯定=0。
    就看第5位,如果第5位原来是1,那么1&1=1;如果是0&1=0。如果结果还是等于0001 0000,就说明你的数组中第5位是1,你可以操作;
    否则,为0000 0000,说明你的数组中第5位是0,你不可以操作。
      

  3.   

    public class AccessUtil {
    /**
     * long[] operationNoToCode={1,2,4,8......}每一个元素对应一个位是一
     * 1:000001;2:000010;4:000100,如果他具有的操作编号是1~63,那么
     * 转化出来的数组中的第一个元素的值就应该是011111111111(大致是63个1)
     * 假如你从外面点击了一个操作,该操作为5,那么就用找到存放位元素的
     * operationNoToCode数组中找到第5个元素(2*2*2*2)与(&)上该转化出来的
     * 011111111111(大致是63个1),得到的是本身就说明有权限
     */
    private static final long[] operationNoToCode = {
    0x0000000000000001L, 0x0000000000000002L, 0x0000000000000004L, 0x0000000000000008L,
    0x0000000000000010L, 0x0000000000000020L, 0x0000000000000040L, 0x0000000000000080L,
    0x0000000000000100L, 0x0000000000000200L, 0x0000000000000400L, 0x0000000000000800L,
    0x0000000000001000L, 0x0000000000002000L, 0x0000000000004000L, 0x0000000000008000L,
    0x0000000000010000L, 0x0000000000020000L, 0x0000000000040000L, 0x0000000000080000L,
    0x0000000000100000L, 0x0000000000200000L, 0x0000000000400000L, 0x0000000000800000L,
    0x0000000001000000L, 0x0000000002000000L, 0x0000000004000000L, 0x0000000008000000L,
    0x0000000010000000L, 0x0000000020000000L, 0x0000000040000000L, 0x0000000080000000L,
    0x0000000100000000L, 0x0000000200000000L, 0x0000000400000000L, 0x0000000800000000L,
    0x0000001000000000L, 0x0000002000000000L, 0x0000004000000000L, 0x0000008000000000L,
    0x0000010000000000L, 0x0000020000000000L, 0x0000040000000000L, 0x0000080000000000L,
    0x0000100000000000L, 0x0000200000000000L, 0x0000400000000000L, 0x0000800000000000L,
    0x0001000000000000L, 0x0002000000000000L, 0x0004000000000000L, 0x0008000000000000L,
    0x0010000000000000L, 0x0020000000000000L, 0x0040000000000000L, 0x0080000000000000L,
    0x0100000000000000L, 0x0200000000000000L, 0x0400000000000000L, 0x0800000000000000L,
    0x1000000000000000L, 0x2000000000000000L, 0x4000000000000000L, 0x8000000000000000L};
    private static final int operationCodeLength = 11;  public static long[] convertOperationNosToOperationCode(short[] operationNos) {
    long[] operationCode = new long[operationCodeLength];   

    for(int i = 0; i < operationNos.length; i ++) {
    int m = operationNos[i] / 64;
    int n = operationNos[i] % 64;
    System.out.println("m"+operationCode[m]);
    operationCode[m] |= operationNoToCode[n];
    System.out.println(operationNoToCode[n]);
    }
    return operationCode;
    }

    public static boolean canDo(short operationNo, long[] operationCode) {
    int m = operationNo / 64;
    int n = operationNo % 64;

    return ((operationCode[m] & operationNoToCode[n]) == operationNoToCode[n]);
    }
    public static void main(String[] args) {
    short[] operationNos={1,2,3};
    long[] operationCode = convertOperationNosToOperationCode(operationNos);
    for(int i = 0; i < operationCode.length; i ++) {
    System.out.println(String.valueOf(i)+":"+operationCode[i]);
    }

    }
    }