使用位掩碼的權限設計

使用位掩碼的權限設計

權限系統的設計幾乎是每個系統都必需的模塊。 下面就聊一聊基本設計的思路。

位掩碼(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.pswp.cn/bicheng/14433.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/14433.shtml
英文地址,請注明出處:http://en.pswp.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 開始…