Linux 操作系统的权限为什么是1,2,4 而不是 1,2,3?如何用二进制来做权限管理
1、二进制做权限的优点
大家都知道,在Linux操作系统中,x - 可执行权限,w - 可写权限 , r - 可读权限。其权限值分别是1,2,4,但是有没有想过为什么是1,2,4 而不是 1,2,3 呢?
OK , 现在是不是发现 1,2,4 分别对应着2的幂次方(2^0、2^1 、2^2),在计算机中都是以二进制的方式进行存储,在计算时二进制的方式会更快。举个例子:如果一个人拥有读和写的权限,现在他的权限值为6,当需要判断他是否拥有写权限时,只需要用 6 和 2 进行按位与运算(6 & 2 = 2),结果非0 ,所以可以判断拥有此权限。当需要判断他是否拥有可执行权限时,同样只需要用 6 和 1 进行按位与运算 (6 & 1 = 0 ),结果为0,所以可以判断不拥有此权限。
- & =
- &
- ——————----
- 又或者: & =
- &
- ——————-----
为什么只需要用用户的权限值和对应的权限进行按位与运算就可以判断出是否拥有此权限呢??个人理解为:当每个2的幂次方分别代表一个权限时,刚好能够和对应的二进制位对应起来。当用户拥有此权限时,对应的权限值的二进制位会变为1,然后进行按位与运算,从而可以知道是否拥有此权限。
用二进制的方式除了可以加快速度,还有没有其他优点呢?如果在一个应用系统中,我们应该如何用二进制的方式来进行权限管理呢?
想要知道二进制的方式的优势就需要和一般方法进行比较,OK。
- 不采用二进制时数据表的设计:
-
- user - 用户表
- id name
- 1 AA
- 2 BB
- 3 CC
-
- permission表
- id name method/url
- 1 查看帖子 get
- 2 发布帖子 post
- 3 修改帖子 update
- 4 删除帖子 delete
-
- 用户-权限对应表
- id uid perId
- 1 1 1
- 2 1 3
- 采用二进制权限方法时数据表的设计:
-
- user - 用户表
- id name per_value
- 1 AA 6
- 2 BB 7
- 3 CC 4
-
- permission表
- id name method/url value
- 1 查看帖子 get 1
- 2 发布帖子 post 2
- 3 修改帖子 update 4
- 4 删除帖子 delete 8
从上面两张表的设计可以看出:采用二进制的方式少了一张中间表!!!它只多了两个字段:一个是权限对应的权限值,一个是用户拥有的权限值总和,所以可以知道——采用二进制的方式可以少一次表查询。
按照一般方式(不采用二进制的方式)的做法是:
1.获取当前请求的URL , 得到对应的权限对象(或 id)
2.查看当前用户是否含有此权限
采用二进制的方式:获取当前请求的URL ,得到对应的权限对象(权限值),用户的权限值 & 当前权限的权限值
可以看出:采用二进制的方式少了一次表查询。
如果嫌每次请求都要去数据库中获取对应的权限对象太过于麻烦,则可以把全部的权限放入本地缓存中,因为每个请求都会进行判断,则可以视为热点数据,则可以放入本地缓存,从而减少数据库查询。这个时候:
不采用二进制的方式:每次需要去用户-权限对应表中判断是否拥有相应的权限,嫌太麻烦,可以在user里面 用List<Integer> 装入所有自己拥有的权限id
采用二进制的方式:可以直接从本地缓存中取出权限值,然后可用户的权限值进行判断
- | 一般方式 | 二进制方式 |
---|---|---|
空间 | List<Integer> | long |
时间 | O(n) | O(1) |
由上列表可以看出:不管是从时间还是空间来说,二进制的方式都占有明显的优势!!
二、 如何用二进制做权限
现在,可以知道用二进制的方式来做权限拥有明显的优势,那么具体的运算应该是怎样的呢?
- 例子:用户AA含有权限值 , 当前权限值
- . 判断是否含有某个权限: & !=
- &
- ——————-----
- . 添加权限: | = 、 | =
- |
- —————------- -——————---
- . 删除某个权限 : & (~)=
- ~
- ————-------
现在已经知道如何具体的进行运算,但是大家有没有一个问题:一个整型32bit 所对应的权限是有限的,那么应该怎么做呢??是用long吗??是个办法,但是这个能够一次性解决问题吗??有没有更好的办法呢??答案是有的。
结合分级索引,可以这样做:
可以看出:每个权限增加了一个权限位,用作分级,所以,现在唯一标识权限的可以用权限位和权限值来进行标识。那么这个时候:
- public class User {
-
- private Integer userId;
- private String name;
- private String password;
- // 数组下标为0对应的值就为拥有权限位为0的权限值得总和
- private long[] permissionSum;
-
- public boolean hasPermission(Permission permission){
- int position = permission.getPosition();
- long number = permission.getPermissionNum();
- return !((permissionSum[position] & number) == 0);
- }
- }
每个用户的权限值就需要用一个数组来存储,其下标为0的对应着权限位为0的权限值和。这个是不是又转换为数据结构的问题了,所以基础很重要嘛~
Linux 操作系统的权限为什么是1,2,4 而不是 1,2,3?如何用二进制来做权限管理的更多相关文章
- 用session做权限控制
一个需要用户进行登录的网站,基本上都会设置用户权限,对不同的用户进行权限控制.例如:一个网站肯定会有一个管理员管理着普通的用户,普通的用户不可能对其他用户有着类似于增删改查等操作,这样网站都乱了--, ...
- linux操作系统的目录以及用户权权限的管理
linux操作系统的目录以及对目录的操作 一: linux操作系统的目录结构 bin #可执行程序的安装目录 , 命令 boot #系统启动引导目录 dev #设备目录 etc #软件配置文件目录 ...
- Linux操作系统的权限代码分析【转】
转自:http://blog.csdn.net/lixuyuan/article/details/6217502 现在关于内核的书很少涉及到Linux内核的安全,内核安全大概包括了密码学实现(cryp ...
- 如何提高Linux操作系统的安全性 转自https://yq.aliyun.com/articles/24251?spm=5176.100239.blogcont24250.7.CfBYE9
摘要: Linux系统不论在功能上.价格上或性能上都有很多优点,但作为开放式操作系统,它不可避免地存在一些安全隐患.关于如何解决这些隐患,为应用提供一个安全的操作平台,本文会告诉你一些最基本.最常用, ...
- 揭开Linux操作系统的Swap交换区之谜
揭开Linux操作系统的Swap交换区之谜 Swap,即交换区,除了安装Linux的时候,有多少人关心过它呢?其实,Swap的调整对Linux服务器,特别是Web服务器的性能至关重要.通过调整Swap ...
- Linux操作系统的文件链接
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++标题:Linux操作系统的文件链接内容:文件链接时间:2019年 ...
- 计算机与linux操作系统的发展
一.计算机 (一)计算机的概念 1.概念:计算机(computer)俗称电脑,是一种用于高速计算的电子计算机器,可以进行数值计算,又可以进行逻辑计算,还具有存储记忆功能.是能够按照程序运行,自动.高速 ...
- Linux操作系统的日志管理之rsyslog实战案例
Linux操作系统的日志管理之rsyslog实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.日志介绍 1>.什么是日志 历史事件: 时间,地点,人物,事件 日志级 ...
- Linux操作系统的计划任务
Linux操作系统的计划任务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.任务计划概述 Linux任务计划.周期性任务执行 未来的某时间点执行一次任务: at: 指定时间点, ...
随机推荐
- Winform中实现将照片剪贴到系统剪切板中(附代码下载)
场景 效果 点击剪切按钮 点击粘贴按钮 注: 博客主页: https://blog.csdn.net/badao_liumang_qizhi 关注公众号 霸道的程序猿 获取编程相关电子书.教程推送与免 ...
- 在mpvue引入flyio
先来说微信小程序原生的请求接口方式吧,如官网文档,在页面中请求直接调用 在这里感谢接的是提供的免费接口https://blog.csdn.net/c__chao/article/details/785 ...
- EtreCheck是否修复恶意软件和广告软件?为什么EtreCheck无法制作截图?
EtreCheck for Mac是一款Mac上的软件,有很对人对这款软件并不熟系,今天小编就来给大家介绍一下这款软件最常出现的问题—EtreCheck是否修复恶意软件和广告软件?为什么EtreChe ...
- Nginx+Tomcat8+Memcached实现负载均衡及session共享
1> 基础环境 简易拓扑图: 2> 部署Tomcat [root@node01 ~]# ll -h ~ |egrep 'jdk|tomcat'-rw-r--r-- 1 root root ...
- css3 中的渐变
虽说css3 都已经使用多年了,但是关于css3的渐变用的很少.今天遇见了,就学习了一下. 首先我们打开ps,新建一个画布,选择渐变工具,这个时候我们能够看到顶栏上面的渐变类型如下 第一个我们选中的是 ...
- .Net Core 项目发布到Linux - CentOS 7(二)用Supervisor守护netcore进程
简介 supervisor可以保证程序崩溃后,可以重新把程序启动起来等相关功能. 安装 yum install -y supervisor 安装好后在/etc/会生成一个supervisord.con ...
- C# 打开文件/跳转链接
mark一下~ 打开文件 1.打开文件夹: System.Diagnostics.Process.Start(FolderPath);-- 打开文件夹 System.Diagnostics.Proce ...
- useradd命令详解(转)
1.作用 useradd或adduser命令用来建立用户帐号和创建用户的起始目录,使用权限是超级用户. 2.格式 useradd [-d home] [-s shell] [-c comment] [ ...
- Django 执行 makemigrations 显示 No changes detected in app
在Django项目配置一下多数据库,但是运行 makemigrations 执行不正常 $ python manage.py makemigrations polls No changes detec ...
- Hello universe!
Hello, universe. This is my first cnblogs article.this blog apply to computer technology and another ...