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

基于位的权限系统

基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中,不同的权限被编码为2的幂次方 (例如1、2、4、8等),每个权限对应一个独立的二进制位(可想而知运算速度是非常快的)。通过将这些权限值组合在一起形成一个整数(比如1+2+4),可以表示用户所拥有的所有权限集合。

将不同的权限组合成一个整数,通过位运算来快速且方便地判断用户是否具有某种或某几种权限。

例如,在权限管理中: 

查看权限对应值为 1、添加权限对应值为 2

修改权限对应值为 4、删除权限对应值为 8
假设有一个用户,他拥有查看修改权限,那么他的权限值就是 1 + 4 = 5(二进制是 0101)。 

验证用户权限时:

  • 检查用户是否有查看权限:用户权限 & 1 是否等于 1。
  • 检查用户是否有修改权限:用户权限 & 4 是否等于 4。
  • 检查用户是否有查看和修改权限: 用户权限 &(1|4)是否等于(1 + 4) 。

如果要赋予用户所有权限,则权限值将是 1 + 2 + 4 + ..直到覆盖所有权限位,这样用户的权限值就是一个包含了所有有效权限位均为1的二进制数。
这种二进制算法用于权限管理既高效又节省存储空间,非常适合于大型系统的权限控制。

以下是实现代码示例:

const PERMISSINOS = {VIEW: { value: 1, name: "VIEW" },       // 权限值为 1,名称为 VIEWADD: { value: 2, name: "ADD" },         // 权限值为 2,名称为 ADDEDIT: { value: 4, name: "EDIT" },       // 权限值为 4,名称为 EDITDELETE: { value: 8, name: "DELETE" }    // 权限值为 8,名称为 DELETE
};// 获取用户拥有的权限列表
function getPermissions(userPermissions) {const userHasPermissions = [];for (let permission in PERMISSINOS) {if (hasPermission(userPermissions, PERMISSINOS[permission].value)) {userHasPermissions.push(PERMISSINOS[permission].name); // 将权限名称添加到数组}}return userHasPermissions;
}// 判断用户是否拥有某个权限
function hasPermission(userPermissions, permission) {return (userPermissions & permission) === permission;  // 进行位运算判断
}let userPermissions = 7;   // 用户权限值为 7,即二进制 0111console.log(getPermissions(userPermissions)); // 返回 ["VIEW", "ADD", "EDIT"],即用户拥有 VIEW、ADD、EDIT 三个权限

当userPermissions = 7;  则返回VIEW ADD EDIT三个权限内容

当userPermissions = 5   则返回VIEW  EDIT两个权限内容

 总结:

位的权限系统的优势在于存储效率是极高的,需要利用一个数字,就能够表示多种权限,极大的节省了空间,且处理速度是非常快的,因为位运算比传统的循环判断要来的快,尤其在处理数据时更为的高校(大数据)。

扩展性也是非常强的,添加新的权限只需要选择下一个未使用的2的幂次方即可。并不会影响现有的权限结构。

不足点:可读性并不良好,对于非程序员或对于未操作不熟悉开发者来说,直接查看权限数值可能难以理解这个数值所代表的具体的权限集合。而且如果要去处理非常复杂的权限模型,比如层级权限,动态权限,基于位的权限系统可能不是那么灵活。

对于边界的条件问题,也会存在一定障碍,如果权限的数量超出了一定的范围,例如32位或64位整数所代表的数量,那么则需要重新去计算我们的一个数据结构

相关文章:

基于位的权限系统

基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中,不同的权限被编码为2的幂次方 (例如1、2、4、8等),每个权限对应一个独立的二进制位(可想而知运算速度是非常快的)。通过将这些权限值组合在一起形成一个…...

[AIGC] Spring Boot Docker 部署指南

Spring Boot Docker 部署指南 引言 近年来,容器化部署成为了越来越流行的部署方式。Docker 是目前最受欢迎的容器化平台之一,它提供了一种将应用程序与其依赖项打包在一起,并以容器的形式运行的方法。Spring Boot 是一种用于快速开发和微服…...

图像处理------亮度

from PIL import Imagedef change_brightness(img: Image, level: float) -> Image:"""按照给定的亮度等级&#xff0c;改变图片的亮度"""def brightness(c: int) -> float:return 128 level (c - 128)if not -255.0 < level < 25…...

LeetCode刷题---基本计算器

解题思路&#xff1a; 根据题意&#xff0c;字符串中包含的运算符只有和- 使用辅助栈的方法来解决该问题 定义结果集res和符号位sign(用于判断对下一数的加减操作),接着对字符串进行遍历。 如果当前字符为数字字符&#xff0c;判断当前字符的下一个字符是否也是数字字符&#x…...

Kafka生产消费流程

Kafka生产消费流程 1.Kafka一条消息发送和消费的流程图(非集群) 2.三种发送方式 准备工作 创建maven工程&#xff0c;引入依赖 <dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>3.3.1…...

c 小熊猫 c++ IDE编译ffmpeg 设置

菜单-》运行-》运行参数->编译器->编译器配置集->链接时加入下列选项 &#xff1a; -I /usr/local/ffmpeg/include -L /usr/local/ffmpeg/lib -lavformat -lavdevice -lavfilter -lavcodec -lavutil -lswscale -lswresample -lm 本机ffmpeg存储位置&#xff1a;inclu…...

【Java】十年老司机转开发语言,新小白从学习路线图开始

欢迎来到《小5讲堂》 大家好&#xff0c;我是全栈小5。 这是《Java》序列文章&#xff0c;每篇文章将以博主理解的角度展开讲解&#xff0c; 特别是针对知识点的概念进行叙说&#xff0c;大部分文章将会对这些概念进行实际例子验证&#xff0c;以此达到加深对知识点的理解和掌握…...

5.3 Verilog 带参数例化

5.3 Verilog 带参数例化 分类 Verilog 教程 关键词&#xff1a; defparam&#xff0c;参数&#xff0c;例化&#xff0c;ram 当一个模块被另一个模块引用例化时&#xff0c;高层模块可以对低层模块的参数值进行改写。这样就允许在编译时将不同的参数传递给多个相同名字的模块…...

边缘计算的挑战和机遇

边缘计算是一种分布式计算框架&#xff0c;它将应用程序、数据和计算服务带离集中式数据中心&#xff0c;靠近用户和数据源的位置。这种方法可以减少延迟&#xff0c;提高服务速度&#xff0c;并可能改善数据安全性和隐私性。然而&#xff0c;边缘计算同时也面临着挑战&#xf…...

Mybatis基础---------增删查改

目录结构 增删改 1、新建工具类用来获取会话对象 import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.apache.ibatis.io.Resources;import java.io…...

CentOS查看修改时间

经常玩docker的朋友应该都知道&#xff0c;有很多的镜像运行起来后&#xff0c;发现容器里的系统时间不对&#xff0c;一般是晚被北京时间8个小时&#xff08;不一定&#xff09;。 这里合理怀疑是镜像给的初始时区是世界标准时间&#xff08;也叫协调世界时间&#xff09;。 有…...

Kafka消费流程

Kafka消费流程 消息是如何被消费者消费掉的。其中最核心的有以下内容。 1、多线程安全问题 2、群组协调 3、分区再均衡 1.多线程安全问题 当多个线程访问某个类时&#xff0c;这个类始终都能表现出正确的行为&#xff0c;那么就称这个类是线程安全的。 对于线程安全&…...

RPC原理介绍与使用(@RpcServiceAnnotation)

Java RPC&#xff08;Remote Procedure Call&#xff0c;远程过程调用&#xff09;是一种用于实现分布式系统中不同节点之间通信的技术。它允许在不同的计算机或进程之间调用远程方法&#xff0c;就像调用本地方法一样。 ** 一.Java RPC的原理如下&#xff1a; ** 定义接口&…...

力扣labuladong——一刷day94

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言二叉堆&#xff08;Binary Heap&#xff09;没什么神秘&#xff0c;性质比二叉搜索树 BST 还简单。其主要操作就两个&#xff0c;sink&#xff08;下沉&#xf…...

Vim 是一款强大的文本编辑器,广泛用于 Linux 和其他 Unix 系统。以下是 Vim 的一些基本用法

Vim 是一款强大的文本编辑器&#xff0c;广泛用于 Linux 和其他 Unix 系统。以下是 Vim 的一些基本用法&#xff1a; 打开文件&#xff1a; vim filename 基本移动&#xff1a; 使用箭头键或 h, j, k, l 分别向左、下、上、右移动。Ctrl f: 向前翻页。Ctrl b: 向后翻页。…...

软件工程:黑盒测试等价分类法相关知识和多实例分析

目录 一、黑盒测试和等价分类法 1. 黑盒测试 2. 等价分类法 二、黑盒测试等价分类法实例分析 1. 工厂招工年龄测试 2. 规定电话号码测试 3. 八位微机测试 4. 三角形判断测试 一、黑盒测试和等价分类法 1. 黑盒测试 黑盒测试就是根据被测试程序功能来进行测试&#xf…...

stable-diffusion 学习笔记

必看文档&#xff1a; 万字长篇&#xff01;超全Stable Diffusion AI绘画参数及原理详解 - 知乎 &#xff08;提示词&#xff09;语法控制 常用语法&#xff1a; 加权&#xff1a;() 或 {} 降权&#xff1a;[](word)//将括号内的提示词权重提高 1.1 倍 ((word))//将括号内的提示…...

手写webpack核心原理,支持typescript的编译和循环依赖问题的解决

主要知识点 babel读取代码的import语句算法&#xff1a;bfs遍历依赖图为浏览器定义一个require函数的polyfill算法&#xff1a;用记忆化搜索解决require函数的循环依赖问题 Quick Start GitHub&#xff1a;https://github.com/Hans774882968/mini-webpack npm install npm…...

开箱即用之MyBatisPlus XML 自定义分页

调用方法 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;public Page<User> queryListByPage(User user) { Page<User> page new Page<>(1, 12); return userMapper.queryListByPage(page, user); } mapper接口 import co…...

GPT应用开发:运行你的第一个聊天程序

本系列文章介绍基于OpenAI GPT API开发应用的方法&#xff0c;适合从零开始&#xff0c;也适合查缺补漏。 本文首先介绍基于聊天API编程的方法。 环境搭建 很多机器学习框架和类库都是使用Python编写的&#xff0c;OpenAI提供的很多例子也是Python编写的&#xff0c;所以为了…...

A51汇编器Error 21解析与8051开发实践

1. 解析A51汇编器Error 21的根源与应对策略在8051单片机开发过程中&#xff0c;使用Keil C51工具链的A51汇编器时&#xff0c;开发者常会遇到一个令人困惑的报错&#xff1a;"ERROR #21: EXPRESSION WITH FORWARD REFERENCE NOT PERMITTED"。这个错误看似简单&#x…...

基于RL78/G13的电位器ADC采集与串口通信上位机显示系统设计

1. 项目概述与核心思路最近在整理工作室的旧零件&#xff0c;翻出来一块瑞萨电子的RL78/G13开发板&#xff0c;还有几个吃灰的电位器。想着不能浪费&#xff0c;就琢磨着做个简单但能体现MCU基本功的小项目&#xff1a;用这块开发板实时采集电位器的电压&#xff0c;并把数据上…...

一文看懂 Hermes Agent 的 Prompt Builder:系统提示词到底拼进了什么?

一、先说结论&#xff1a;Prompt Builder 是 Hermes 的“提示词总装车间”普通 Chatbot 的系统提示词往往是一段固定文字&#xff0c;告诉模型“你是谁、怎么回答”。Hermes Agent 的 Prompt Builder 更像一条总装线&#xff1a;它会把身份、记忆、用户画像、项目规则、技能目录…...

告别检测卡点,okbiye 智能双优化破解毕业论文查重与 AI 识别难题

okbiye-免费查重复率aigc检测/开题报告/毕业论文/智能排版/文献综述/AI PPT降重复率 - Okbiye智能写作https://www.okbiye.com/reduceAIGC 一、引言&#xff1a;论文定稿阶段两大检测难题普遍困扰学子 论文撰写收尾阶段&#xff0c;绝大多数毕业生都会直面两道审核关卡&#x…...

CANN ONNX 模型生态兼容实战:从模型导入、算子映射到常见报错排查的全流程指南

一、ONNX 与 CANN 的关系 1.1 模型流转路径 PyTorch/TensorFlow↓ (export)ONNX 模型↓ (ATC 转换)CANN .om 模型↓ (ACL 推理)昇腾 NPU 执行ONNX 是中间格式&#xff0c;ATC 是桥梁1.2 为什么需要了解兼容性 常见痛点:1. PyTorch 新算子 ONNX 不支持2. ONNX 支持但 ATC 不支…...

C#从零开始学习笔记---第九天

又是新的一天&#xff0c;欢迎大家继续查看我的学习笔记&#xff0c;这两天确实状态一般&#xff0c;今天内容我们也不记录太多&#xff0c;主要分为两大块&#xff0c;第一块是对之前提到过的数组进行一个复习&#xff0c;第二块就是在记录一下集合和哈希表的一些内容。话不多…...

源代码论文分享|社区养老服务平台的设计与实现!

有些毕业设计题目&#xff0c;听起来不是特别“炫”&#xff0c;但真的很适合做&#xff0c;也很容易写出实际意义。 比如这次分享的这个项目&#xff1a;社区养老服务平台的设计与实现。 现在社区养老、居家养老、智慧养老这些方向本身就很有现实背景&#xff0c;老师看到这…...

实战测试10款降AIGC软件:只选真正管用的那一款!

随着AI写作工具的普及&#xff0c;论文撰写和内容创作变得前所未有的高效&#xff0c;许多学生和职场人都从中受益。然而&#xff0c;随着AIGC检测技术的不断升级&#xff0c;越来越多的人开始面临新的挑战&#xff1a;原本流畅自然的AI生成内容&#xff0c;如今很容易被系统识…...

观察Taotoken在多模型聚合调用下的稳定性与路由表现

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 观察Taotoken在多模型聚合调用下的稳定性与路由表现 1. 引言 在构建依赖大模型能力的应用时&#xff0c;服务的连续性与稳定性是开…...

BP-4500-PoER工控机:宽温无风扇设计,6网口4PoE+,赋能机器视觉与边缘计算

1. 项目概述&#xff1a;一台为严苛环境而生的工业视觉“大脑”在机器视觉、边缘计算或者工业自动化现场&#xff0c;我们常常需要一台足够“皮实”的计算机。它不能是办公室里娇贵的台式机&#xff0c;也不能是性能孱弱的单板机。它需要扛得住产线上的粉尘、振动&#xff0c;耐…...