使用位掩码的权限设计

使用位掩码的权限设计

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

位掩码(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,表示拥有操作权限。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/14433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于深度学习OCR文本识别系统源码(带界面)

第一步&#xff1a;概要 基于深度学习OCR文本识别分为两个模块&#xff1a;DBNet和CRNN。 DBNet是基于分割的文本检测算法&#xff0c;算法将可微分二值化模块(Differentiable Binarization)引入了分割模型&#xff0c;使得模型能够通过自适应的阈值图进行二值化&#xff0c;并…

Postgresql 基础学习

一、介绍 PostgreSQL是一个开源的关系型数据库管理系统&#xff08;RDBMS&#xff09;&#xff0c;它支持SQL语言的所有功能&#xff0c;具有可扩展性、高并发性和可靠性等特点。 以下是一些 PostgreSQL 的特点&#xff1a; 开源&#xff1a;PostgreSQL是一个非常受欢迎的开源…

Python-温故知新

1快速打开.ipynb文件 安装好anaconda后&#xff0c;在需要打开notebook的文件夹中&#xff0c; shift键右键——打开powershell窗口——输入jupyter notebook 即可在该文件夹中打开notebook的页面&#xff1a; 2 快速查看函数用法 光标放在函数上——shift键tab 3...

Docker镜像源自动测试镜像速度,并选择速度最快的镜像

国内执行如下代码 bash <(curl -sSL https://gitee.com/xjxjin/scripts/raw/main/check_docker_registry.sh)国外执行如下代码 bash <(curl -sSL https://github.com/xjxjin/scripts/raw/main/check_docker_registry.sh)如果有老铁有比较不错的镜像源&#xff0c;可以提…

探索Python编程乐趣:制作气泡反弹小游戏

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言&#xff1a;Python编程的轻松入门 二、游戏实现原理&#xff1a;气泡反弹的逻辑 …

探索生态农业,守护绿色家园

在繁忙的都市生活中&#xff0c;我们往往忽略了与自然和谐相处的重要性。而生态农业&#xff0c;正是让我们重拾与大自然亲密关系的桥梁。通过采用生态友好的耕作方式&#xff0c;生态农业不仅能够提供健康、营养的农产品&#xff0c;还能够保护生态环境&#xff0c;实现人与自…

Android高通 12/13静默安装和卸载

1、静默安装和静默卸载 涉及代码路径感兴趣可以去看下如下所示&#xff0c;这里不作重点赘述哈 Package Manger frameworks/base/services/java/com/android/server/pm/Settings.java frameworks/base/services/java/com/android/server/pm/PackageManagerService.java framew…

CCS基础入门

视频&#xff1a; CCS使用教程_哔哩哔哩_bilibili 创建工程 步骤一&#xff1a;创建 方法一&#xff1a; 方法二&#xff1a; 方法三&#xff1a; 步骤二&#xff1a;选择工程配置 步骤三&#xff1a;完成创建 编译工程&#xff1a; 方法一&#xff08;最常用&#xff09;…

Excel中自动验证URL网址链接有效性

下面表格中的网址有的可以打开&#xff0c;有的不能打开 在Excel中按下 Alt F11 键来打开VBA编辑器&#xff0c;选择 插入 > 模块&#xff0c;创建一个新的模块&#xff0c;在新创建的模块窗口中输入以下代码&#xff1a; Function 测试网址(ByVal URL As String) As Str…

$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams

问题描述 动态添加子view的时候&#xff0c;报crash&#xff0c;提示$LayoutParams cannot be cast to android.widget.RelativeLayout$LayoutParams 完整错误堆栈 :12.946 11951-11951/com.xx E/CrashReport: sys default last handle start! 11-16 12:21:13.041 11951-1195…

笔记-X86下用Docker运行ARM64编译Libreoffice

初衷 针对恶略环境下的自适应&#xff0c;记个笔记&#xff0c;苦于没有外网的arm架构环境&#xff0c;内网中安装个arm类型的deb&#xff0c;难如登天&#xff0c;突然发现这个好东西。 参考引用 x86架构的Ubuntu上通过Docker运行ARM架构的系统 前提 docker已经安装好 安…

UDP协议与TCP协议1.2

UDP UDP数据报UDP报头UDP载荷 UDP的报文格式&#xff1a; 这里的UDP长度&#xff0c;描述了整个UDP数据报&#xff0c;占多少个字节&#xff0c;这里整个UDP长度最多是64kb 在UDP中校验和就是使用CRC的方式来完成的 数据在网络传输中是可能会出现错误的&#xff0c;例如比特翻…

Linux日志定位实战指令总结

一、日志定位的常用Linux指令 步骤&#xff08;一&#xff09;&#xff1a;如果你不知道日志的位置&#xff0c;Linux指令如何查找到日志所在的位置呢&#xff1f; 要快速定位到名为nfm-info.log的文件&#xff0c;你可以使用find命令或locate命令。这两个命令都能够搜索文件…

uniappx 安卓保活(多种技术;UTS版) Ba-KeepAlive-U

简介&#xff08;下载地址&#xff09; Ba-KeepAlive-U 是一款android原生保活插件&#xff0c;UTS版本&#xff08;同时支持uniapp和uniappx&#xff09;&#xff0c;支持市面上大部分机型&#xff0c;Android4.4到Android14&#xff08;**注意&#xff1a;**不保证支持所有机…

MoonBit 周报 Vol.41:替换 Array 实现、键值对增加模式匹配支持

MoonBit更新 【Breaking Change】Array重命名为FixedArray&#xff0c;vec.Vec重命名为Array // Before fn init {let array : vec.Vec[Int] [1, 2, 3] } // After fn main {let array : Array[Int] [1, 2, 3] }【语法】键值对&#xff08;如Map HashMap等&#xff09;增加…

正则表达式(知识总结篇)

本篇文章主要是针对初学者&#xff0c;对正则表达式的理解、作用和应用 正则表达式&#x1f31f; 一、&#x1f349;正则表达式的概述二、&#x1f349;正则表达式的语法和使用三、 &#x1f349;正则表达式的常用操作符四、&#x1f349;re库主要功能函数 一、&#x1f349;正…

远动通讯屏柜的组成及各装置的作用

远动通讯屏柜的组成及各装置的作用 远动通讯屏是基于公共电网安全而投入的远方监控遥控设备&#xff1b;主要由远动装置、通讯管理机、交换机、调制解调器、GPS对时装置、数字通道防雷器、模拟通道防雷器、插线板、空气开关、屏柜及附件等设备组成、标配尺寸2260*800*600&…

C++设计模式---面向对象原则

面向对象设计原则 原则的目的&#xff1a;高内聚&#xff0c;低耦合 1. 单一职责原则 类的职责单一&#xff0c;对外只提供一种功能&#xff0c;而引起类变化的原因都应该只有一个。 2. 开闭原则 对扩展开放&#xff0c;对修改关闭&#xff1b;增加功能是通过增加代码来实现的&…

【linux特殊符号】

文章目录 学习目标一、Linux的特殊符号1.系统变量2.引号 总结 学习目标 1.学会查看系统变量 2.学会各种引号 3.一、Linux的特殊符号 1.系统变量 windows系统变量&#xff1a;echo %path% linux系统变量&#xff1a;echo $PATH2.引号 " " 双引号&#xff0c;换行…

如何基于springboot构建cas最新版源码?

环境准备 下载JDK21 https://download.oracle.com/java/21/archive/jdk-21.0.2_windows-x64_bin.zip下载gradle 8.5并配置环境变量 https://gradle.org/next-steps/?version8.5&formatbin下载项目git clone http://gitlab.ruishan.cc/meta/anka-authentication.git 开始…