基于位的权限系统

基于位的权限系统是一种利用二进制位运算进行权限管理的技术。在这种系统中,不同的权限被编码为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位整数所代表的数量,那么则需要重新去计算我们的一个数据结构

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

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

相关文章

力扣198. 打家劫舍(java 动态规划)

Problem: 198. 打家劫舍 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 1.构建多阶段决策模型:n个房屋对应n个阶段,每一个阶段决定一个房间是偷还是不偷,两种决策:偷、不偷 2.定义状态:不能记录每个阶段决策…

笔记系统的部署架构

前天给笔记系统打了0.0.3的tag,一个简单的全栈功能闭环基本完成。既然是开源,因此,这里有必要分享一下部署结构,希望能够获得小伙伴们的反馈。 目前整个系统采用docker容器来部署。应用介绍 auth_app: 登录/注册的前端应用 web_ap…

西贝柳斯音乐记谱软件Avid Sibelius Ultimate 2023中文激活版

Avid Sibelius(西贝柳斯终极解锁版) 是一款记谱软件,从有抱负的作曲家和词曲作者到教师和学生,任何人都可以快速轻松地开始创作和分享音乐。对于那些还不熟悉使用符号软件的人来说,直观的界面将引导您完成整个过程。磁性布局可防止对象相互碰…

跨国企业如何高效又安全的传输视频大文件?

在视频传输需求日益增长的今天,如何高效、安全地传输视频大文件成为跨国企业面临的重要问题。传统的文件传输方式存在诸多弊端,无法满足跨国企业对于传输效率、文件安全以及合规性的需求。那么跨国企业如何在市场是找到一种文件传输工具能在安全性、稳定…

构建基于RHEL9系列(CentOS9,AlmaLinux9,RockyLinux9等)的MySQL8.0.32的RPM包

本文适用:rhel9系列,或同类系统(CentOS9,AlmaLinux9,RockyLinux9等) 文档形成时期:2023年 因系统版本不同,构建部署应略有差异,但本文未做细分,对稍有经验者应不存在明显障碍。 因软件世界之复杂和个人能力…

Elastic Search的RestFul API入门:DSL查询

在我们之前的基础篇中,我们已经初步了解了DSL的架构与基础结构。现在,我们将进一步学习DSL的查询语句,这些查询语句对于我们的工作和学习而言至关重要。 DSL(Domain Specific Language)是一种专门用于特定领域的编程语言。在Elasticsearch(ES)中,DSL被广泛用于构建灵活…

debug之pycharm调试:出现Collecting data......

pycharm调试时,出现Collecting data… 一直在这个界面很久,这是新版本的Pycharm的bug,通常在多线程的情况下发生。 解决方法: File->Setting->Build,Execution,Deployment->Python Debugger。把Gevent compatible勾选…

Postgresql 12.2 + PostGIS 3.0.1 安装部署

参考文档: 按照该文档安装即可,如果遇到报错,可以参考下文: https://blog.csdn.net/weixin_41166785/article/details/127674169 所需的安装包 在资源里面(我看下怎么可以不用积分下载) 1、no acceptable…

代码随想录算法训练营第六天 |242.有效的字母异位词,349.两个数组的交集,202.快乐数,1.两数只和

哈希表理论基础 1、哈希表定义: 哈希表是根据关键码的值而直接进行访问的数据结构。 这么这官方的解释可能有点懵,其实直白来讲其实数组就是一张哈希表。 哈希表中关键码就是数组的索引下标,然后通过下标直接访问数组中的元素&#xff0c…

花几分钟整点jmeter花活,轻松超越90%软件测试

jmeter 可以做性能测试,这个很多人都知道,那你知道,jmeter 可以在启动运行时,指定线程数和运行时间,自定义性能场景吗? jmeter 性能测试,动态设定性能场景 平时,我们使用 jmeter 进…

天津大数据分析培训班 常见的大数据培训课程

大数据现在属于热门职业技能之一,不管是大学毕业生,计算机和数据相关专业青年,已经工作一阵的开发人员,运营小白,还是其他想进入这个行当的,可能还没有编程基础的转行人,都想尝试大数据行业&…

LLM论文:ALCE (Enabling Large Language Models to Generate Text with Citations)

这是一篇RAG领域的文章,原文在这:https://aclanthology.org/2023.emnlp-main.398.pdf 时间[Submitted on 24 May 2023 (v1), last revised 31 Oct 2023 (this version, v2)]背景LLM在信息搜索、生成带引用的文本时存在幻觉问题,即事实准确性…

【Axure高保真原型】树控制内联框架

今天和大家分享树控制内联框架的原型模板,点击树的箭头可以打开或者收起子节点,点击最后一级人物节点,可以切换右侧内联框到对应的页面,左侧的树是通过中继器制作的,使用简单,只需要按要求填写中继器表格即…

艾瑞报告:HR数字化需关注体系化能力,红海云等标杆厂商引领一体化趋势

新全球化时代背景下,企业经营所面临的国内外环境的不确定性增强,如何从不确定性中找到确定性成了大多数企业的关注要点。近日,艾瑞咨询发布《2023中国人力资源数字化研究报告》,从数字化转型的角度切入,探讨数字化如何…

基于传统机器学习模型算法的项目开发详细过程

1 场景分析 1.1 项目背景 描述开发项目模型的一系列情境和因素,包括问题、需求、机会、市场环境、竞争情况等 1.2. 解决问题 传统机器学习在解决实际问题中主要分为两类: 有监督学习:已知输入、输出之间的关系而进行的学习,从而…

二叉树DFS

基础知识 二叉树遍历 二叉搜索树BST 二叉树三种深度遍历 LeetCode 94. 二叉树的中序遍历 class Solution {public List<Integer> inorderTraversal(TreeNode root) {List<Integer> ans new ArrayList<>();inorder(root, ans);return ans;}public void in…

Pod的控制器

Pod的控制器是什么&#xff1f; pod控制器&#xff1a;工作负载均衡。workload。用于管理pod的中间层。确保pod资源符合预期的状态。 预期状态&#xff1a; 副本数 容器的重启策略 镜像拉取策略 pod出现故障时的重启等等 Pod控制器的类型 1、 replicaSet&#xff1a;指…

NLP论文阅读记录 - WOS | 2023 TxLASM:一种新颖的与语言无关的文本文档摘要模型

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.文献综述及相关工作三.本文方法四 实验效果4.1数据集4.2 对比模型4.3实施细节4.4评估指标4.5 实验结果4.6 细粒度分析 五 总结思考 前言 TxLASM: A novel language agnostic summarization mo…

用了这8个 Python 数据挖掘工具包,生产力明显得到了提升!

在进行数据科学时&#xff0c;可能会浪费大量时间编码并等待计算机运行某些东西。所以我选择了一些 Python 库&#xff0c;可以帮助你节省宝贵的时间。 喜欢记得收藏、关注、点赞&#xff0c;文末送技术交流和资料 1、Optuna Optuna 是一个开源的超参数优化框架&#xff0c;…

ArkTS中自定义组件

ArkTS中自定义组件 一、组件位置二、Hello.ets自定义组件自定义组件 三、Second.ets父组件 一、组件位置 一个项目下所有的自定义的组件名不可以重复&#xff0c;无论是否在一个ets文件中 二、Hello.ets自定义组件 自定义组件 1&#xff1a;组件必须使用Component装饰 2&#…