当前位置: 首页 > news >正文

使用位掩码的权限设计

使用位掩码的权限设计

权限系统的设计几乎是每个系统都必需的模块。 下面就聊一聊基本设计的思路。

位掩码(BitMask),是位(Bit)和掩码(Mask)的组合词。

“位”指代着二进制数据当中的二进制位,而”掩码“指的是用于进行按位操作的二进制数字。

位掩码权限(Bitmask Permissions)是一种权限管理系统设计思路,用于在程序使用中进行控制和限制。 它使用一系列二进制位来表示不同的权限或访问级别。

每个二进制位都代表一种权限或操作,可以设置1或者0为开启或关闭。

比如有下列权限7位二进制序列 表示一种权限系列。

11111111。

有此权限,在对应二进制位置设置为1,无此权限,对应二进制位值设置为0;

权限种类设计(字典数据)

 二进制位  	权限描述(位置序号) 0	:	权限01	:	权限12	:	权限23	:	权限34	:	权限45	:	权限56	:	权限67	:	权限7

权限种类字典数据,对应的二进制数据计算方式:(使用位移运算符)

权限0	:	1<<0	:	等于十进制 1
权限1	:	1<<1	:	等于十进制 2
权限2	:	1<<2	:	等于十进制 4	
权限3	:	1<<3	:	等于十进制 8	
权限4	:	1<<4	:	等于十进制 16	
权限5	:	1<<5	:	等于十进制 32	
权限6	:	1<<6	:	等于十进制 64	
权限7	:	1<<7	:	等于十进制 128	...	:	...	:	......	:	...	:	......	:	...	:	...

如何设置某个用户权限数值(十进制数值)?

为某个用户的设置多种权限:将每个权限的十进制数值相加。

SELECT  SUM(POWER(2, role_code.indx)) AS my_role_value
FROM (VALUES(1,'权限1'),(2,'权限2')
)AS role_code(indx,name)

查询结果为(十进制数值)

   my_role_value 6

如何查询某个用户有哪些权限?

将用户权限数值,与每个权限字典数据进行“按位与”计算。

如果“按位与”后的数值与权限种类字典数据相等,就说明包含此权限。

假如某用户的权限十进制数值为:roleValue=6

使用SQL求解用户包含的权限列表

   SELECT  role_code.indx AS role_index,role_code.name AS role_name,POWER(2, role_code.indx) AS role_value,tmp.my_role_value,/*“按位与”*/tmp.my_role_value & POWER(2, role_code.indx)AS include_role_value,role_code.indx  AS include_role_index
FROM (VALUES(0,'权限0'),(1,'权限1'),(2,'权限2'),(3,'权限3'),(4,'权限4'),(5,'权限5'),(6,'权限6'),(7,'权限7')
) AS role_code(indx,name)
/*某用户的权限十进制数值*/
,(select 6 AS my_role_value) AS tmp
/*“按位与”等于权限的十进制数值的*/
WHERE (tmp.my_role_value & POWER(2, role_code.indx)) =  POWER(2, role_code.indx)

查询结果为

role_index|	role_name|	role_value|	my_role_value|	include_role_value|	include_role_index1|		权限1|		2|		6|			2|			12|		权限2|		4|		6|			4|			2	

如何判断某个用户是否有操作程序某些功能模块的权限?

假设功能模块需要(2,'权限2'), (3,'权限3'),才能操作。

而某用户的权限十进制数值为:roleValue=6。

判断是否有此模块的操作权限方法为:

计算功能模块的权限十进制数值: 1<<2+1<<3=12

用户权限的十进制数值 & 功能模块的十进制数值 > 0,表示拥有操作权限。

相关文章:

  • 前端实现打印功能
  • Nginx(负载均衡,反向代理)
  • [实用技巧]Unity中,Sprite和SpriteRenderer的实用小贴士
  • 汽车标定技术(二十一)--英飞凌TC3xx的OLDA怎么玩?(2)
  • Python 造数据神器Faker
  • 如何在window中快速建立多个文件夹?
  • Java技术精粹:高级面试问题与解答指南(二)
  • Python中动态调用C#的dll动态链接库中方法
  • node环境问题(无法加载文件D:\Software\Node.js\node_global\vue.ps1,因为在此系统上禁止运行脚本。)
  • 必应bing国内广告开户首充和开户费是多少?
  • 来盘点我的校园生活(4)
  • 计划跳槽需要做哪些准备?
  • Spring Boot 实现 RabbitMQ 监听消息的几种方式
  • 系统架构师考试(十)
  • 爱设计AiPPT.cn赵充:营销工作的AI进化
  • Android Volley源码解析
  • Angular 2 DI - IoC DI - 1
  • CentOS7简单部署NFS
  • ComponentOne 2017 V2版本正式发布
  • download使用浅析
  • Git的一些常用操作
  • JavaScript新鲜事·第5期
  • Python 基础起步 (十) 什么叫函数?
  • REST架构的思考
  • socket.io+express实现聊天室的思考(三)
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 初探 Vue 生命周期和钩子函数
  • 第13期 DApp 榜单 :来,吃我这波安利
  • 如何利用MongoDB打造TOP榜小程序
  • 我的业余项目总结
  • 如何在 Intellij IDEA 更高效地将应用部署到容器服务 Kubernetes ...
  • 通过调用文摘列表API获取文摘
  • ![CDATA[ ]] 是什么东东
  • #职场发展#其他
  • (1)Nginx简介和安装教程
  • (TOJ2804)Even? Odd?
  • (编译到47%失败)to be deleted
  • (四)Tiki-taka算法(TTA)求解无人机三维路径规划研究(MATLAB)
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (一)ClickHouse 中的 `MaterializedMySQL` 数据库引擎的使用方法、设置、特性和限制。
  • (译)计算距离、方位和更多经纬度之间的点
  • (转)Linq学习笔记
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .NET Core 将实体类转换为 SQL(ORM 映射)
  • .NET MAUI Sqlite程序应用-数据库配置(一)
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .Net 知识杂记
  • .Net程序帮助文档制作
  • .NET的微型Web框架 Nancy
  • .NET简谈设计模式之(单件模式)
  • .NET中 MVC 工厂模式浅析
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @JsonFormat与@DateTimeFormat注解的使用