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: 指定时间点, ...
随机推荐
- Docker图形化工具Portainer详解
一.介绍 说明: Portainer是易于使用的软件,可为软件开发人员和IT操作人员提供直观的界面. Portainer为你提供Docker环境的详细概述,并允许你管理容器,镜像,网络和数据卷 ...
- 创建基于ASP.NET core 3.1 的RazorPagesMovie项目(二)-应用模型类配合基架生成工具生成Razor页面
本节中,将学习添加用于管理跨平台的SQLLite数据库中的电影的类Movie.从ASP.NET core 模板创建的应用使用SQLLite数据库. 应用模型类(Movie)配合Entity Frame ...
- MSSQL - 最佳实践 - 使用SSL加密连接
MSSQL - 最佳实践 - 使用SSL加密连接 author: 风移 摘要 在SQL Server安全系列专题月报分享中,往期我们已经陆续分享了:如何使用对称密钥实现SQL Server列加密技术. ...
- electron初探问题总结
使用electron时间不是很久,随着使用的深入慢慢的也遇到一些问题,下面总结一下遇到的问题与大家分享,避免趟坑. 主要问题汇总如下: webview与渲染进程renderer间通信 BrowserW ...
- <计算机系统结构中的8个伟大思想>
摘自<计算机组成与设计>戴维帕森 ——面向摩尔定律的设计 ——使用抽象简化设计 ——加速大概率事件 ——通过并行提高性能 ——通过流水线提高性能 ——存储器层次 ——通过冗余提高可靠性
- JavaBean动态添加删除属性
1.cglib BeanGenerator beanGenerator = new BeanGenerator(); beanGenerator.addProperty("id", ...
- Vue-cli项目部署到Nginx
项目环境: 0. Nginx使用 以windows版为例,下载niginx压缩包并解压到任意目录,双击nginx.exe,在浏览器中访问http://localhost,如果出现Welcome to ...
- Elasticsearch实现复合查询,高亮结果等技巧
一.Es的配置 实现es的全文检索功能的第一步,首先从与es进行连接开始,这里我使用的是es的5.x java api语法. public TransportClient esClient() thr ...
- 打包vue文件,上传到服务器
主要步骤: 1. npm run build生成dist文件夹 2. 将dist文件夹上传到服务器上 3. 服务器上配置nginx,访问路径指向dist文件夹下的index.html,这样当访问ngi ...
- 【Java基础】Annotation 的本质和自定义实现
Java 中注解的实现原理 一.引言 在 Java5 之前,利用 xml 进行配置是各大框架的常规操作,这种方式可以实现松耦合并完成框架中几乎所有需要的配置,但随着项目的扩展,xml 文件本身的内容将 ...