Permission

概述

整个链我们对参与者进行了 身份的抽象,同时我们对于身份赋予了Permission【类似权限】,Permission可以更加细粒度的控制参与者参加业务的控制范围。当定制业务时需要制定参与各业务的权限,参与者必须具备交易要求的权限才能参与业务操作。

Permission定义

  • Permission结构

  • PermissionIndex:每个Permission都对应一个Index,且Index为正整数,每添加一个Permission,Index会自动加1,Permission只可以添加不可以删除。

  • PermissionName:名称整个链不允许重复

    image-20191113173215168

  • 系统预留0-20个整数的Permission

  • DEFAULT (index为0):Identity默认的的Permission,如果定义的BD业务默认允许所有的Identity都可以参与业务,那么可以将Permission设置为DEFAULT;
  • RS (index为0):可以执行CRSFunction交易(具体参考BD交易)。

  • 添加Permission

  • 通过发送Permission注册交易添加新的Permission。

用户Permission授权流程

  • 通过 “/permission/open/authorize” 接口给地址添加权限,接口参数 identityAddress:授权Identity地址; permissionNames:授权的Permission集合,可同时授权多个Permission; identityType:Identity类型1. user 2. domain 3. node
    {
    "permissionNames":["VP","AIP"]
    "identityAddress":"2b236839774975579cd28704438264cac795e25b"
    "identityType":"1"
    }
  • 链在计算“2b236839774975579cd28704438264cac795e25b”的permission时,会对多个permission进行与或操作
/**
      DEFAULT:0 转换为2的index次方等于1
      VIP:1 转换为2的index次方等于2
      AIP:2 转换为2的index次方等于4
       */

      BigInteger DEFAULT = new BigInteger("2").pow(0);
      BigInteger VIP = new BigInteger("2").pow(1);
      BigInteger AIP = new BigInteger("2").pow(2);

      //对转换的permission求或运算(|)
       BigInteger d= DEFAULT.or(VIP).or(AIP);
      //对求或运算的permission再次转换为32进制,最终Identity的permission记为7
      System.out.println(d.toString(32));

Permission验证

  • 当【2b236839774975579cd28704438264cac795e25b】发送一笔交易执行的Permission为VIP,那么验证流程如下;

  • 会查询该Identity的Permission,通过上一个流程为用户添加了三个Permission,为7;

  • 当前交易执行的Permission为1,会将1转为2的1次方为2;

  • 7和2做and操作结果为2,再将结果与交易的Permission比较,如果相等则验证通过。

       //用户permission和VIP做and操作
      BigInteger e = d.and(VIP);
      int result = e.compareTo(VIP);
      System.out.println("如果result等于0,则验证通过");