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: 指定时间点, ...
随机推荐
- C# -- DateTime与TimeSpan
1. DateTime的使用 DateTime dt = DateTime.Now; StringBuilder sb = new StringBuilder(); sb.AppendLine(str ...
- 用js写一个鼠标坐标实例
HTML代码 写一个div来作为鼠标区域 div中写一个span显示坐标信息 <body> <div id=""> <span></spa ...
- CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现
CVE-2018-12613-phpmyadmin4.8.1远程文件包含漏洞复现 参考文章1 参考文章2 By:Mirror王宇阳 漏洞原理 攻击者利用发现在服务器上包含(查看和潜在执行)文件的漏洞. ...
- Hacker Fest: 2019 Vulnhub Walkthrough
靶机地址: https://www.vulnhub.com/entry/hacker-fest-2019,378/ 主机扫描: FTP尝试匿名登录 应该是WordPress的站点 进行目录扫描: py ...
- Jupyter修改设置
下载完anaconda后Jupyter默认目录是用户目录,默认浏览器是IE,让有强迫症的我有点难受,所以把它的默认目录和浏览器修改一下. 首先运行一下jupyter notebook --genera ...
- Exceptionless应用--自定义插件
遇到的问题/需求 这里会把一些敏感的参数记录下来,我们需要屏蔽掉,如图 我们希望日志里面有当前登录用户的信息,如图: 处理方法 tip:这里用的是.net非.net core 第一个问题(屏蔽敏感参数 ...
- elasticSearch的部署和使用
部署服务 docker run启动elastic服务 docker pull elasticsearch:6.7.2 docker run -d -p 9200:9200 -p 9300:9300 - ...
- 2019年创意可爱卡通小清新教育课件培训PPT模板
模版来源:http://ppt.dede58.com/jiaoxuekejian/26791.html
- 遇见手绘花卉小清新简约通用PPT模板推荐
模版来源:http://ppt.dede58.com/jiaoxuekejian/26484.html
- SSH框架之Spring第三篇
1.1 AOP概述 1.1.1 什么是AOP? AOP : 全称是Aspect Oriented Progamming既 : 面向切面编程.通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技 ...