JavaScript 中的位运算和权限设计( 三 )

除了通过引入权限空间的概念突破二进制运算的位数限制,还可以使用 math.js 的 bignumber,直接运算超过 32 位的二进制数,具体可以看它的文档,这里就不细说了 。
5. 适用场景和问题如果按照当前使用最广泛的 RBAC 模型设计权限系统,那么一般会有这么几个实体:应用,权限,角色,用户 。用户权限可以直接来自权限,也可以来自角色:

  • 一个应用下有多个权限
  • 权限和角色是多对多的关系
  • 用户和角色是多对多的关系
  • 用户和权限是多对多的关系
在此种模型下,一般会有用户与权限,用户与角色,角色与权限的对应关系表 。想象一个商城后台权限管理系统,可能会有上万,甚至十几万店铺(应用),每个店铺可能会有数十个用户,角色,权限 。随着业务的不断发展,刚才提到的那三张对应关系表会越来越大,越来越难以维护 。
而进制转换的方法则可以省略对应关系表,减少查询,节省空间 。当然,省略掉对应关系不是没有坏处的,例如下面几个问题:
  • 如何高效的查找我的权限?
  • 如何高效的查找拥有某权限的所有用户?
  • 如何控制权限的有效期?
所以进制转换的方案比较适合刚才提到的应用极其多,而每个应用中用户,权限,角色数量较少的场景 。
6. 其他方案除了二进制方案,当然还有其他方案可以达到类似的效果,例如直接使用一个1和0组成的字符串,权限点对应index,1表示拥有权限,0表示没有权限 。举个例子:添加 0、删除 1、编辑 2,用户A拥有添加和编辑的权限,则 userCode 为 101;用户B拥有全部权限,userCode 为 111 。这种方案比二进制转换简单,但是浪费空间 。
还有利用质数的方案,权限点全部为质数,用户权限为他所拥有的全部权限点的乘积 。如:权限点是 2、3、5、7、11,用户权限是 5 * 7 * 11 = 385 。这种方案麻烦的地方在于获取质数(新增权限点)和质因数分解(判断权限),权限点特别多的时候就快成 RSA 了,如果只有增删改查个别几个权限,倒是可以考虑 。
来源:掘金 链接:https://juejin.im/post/5dc36f39e51d4529ed292910

【JavaScript 中的位运算和权限设计】


推荐阅读