`
hot88zh
  • 浏览: 182827 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

【转】利用"二进制"来控制权限

阅读更多

一、利用位与
1.介绍:
这里我介绍一种很常用,也比较Professor的权限控制思路。
这里我用java语言描述,其实都差不多的。自己转一下就可以了。
为了方便,我们这里定义a^b为:a的b次方
这里,我们为每一个操作设定一个唯一的整数值,比如:

删除A---0
修改A---1
添加A---2

删除B---3
修改B---4
添加B---5
。。。

理论上可以有N个操作
这取决于你用于储存用户权限值的数据类型了。

这样,如果用户有权限:添加A---2;删除B---3;修改B---4
那用户的权限值 purview =2^2+2^3+2^4=28,也就是2的权的和了(之前打错了)。
化成二进制可以表示为11100
这样,如果要验证用户是否有删除B的权限,就可以通过位与运算来实现。
在Java里,位与运算运算符号为&
即是:int value = purview &((int)Math.pow(2,3));
你会发现,当用户有操作权限时,运算出来的结果都会等于这个操作需要的权限值!
原理:
位与运算,顾名思义就是对位进行与运算:
以上面的式子为例:purview & 2^3 也就是 28&8
将它们化成二进制有
    11100
&   01000
-------------------
    01000 == 8(十进制) == 2^3
同理,如果要验证是否有删除A---0的权限
可以用:purview &((int)Math.pow(2,0));
即:
    11100
   & 00001
------------------------
     00000 ==   0(十进制)  != 2^0

这种算法的一个优点是速度快。可以同时处理N个权限
如果想验证是否同时有删除A---0和删除B---3的权限
可以用purview&(2^0+2^3)==(2^0+2^3)?true:false;
设置多角色用户。根据权限值判断用户的角色。。。

下面提供一个java的单操作权限判断的代码:
//userPurview是用户具有的总权限
//optPurview是一个操作要求的权限为一个整数(没有经过权的!)
public static boolean checkPower(int userPurview, int optPurview)
{
       int purviewValue = (int)Math.pow(2, optPurview);
       return (userPurview & purviewValue) == purviewValue;
}

当然,多权限的验证只要扩展一下就可以了。

2.原理:
其实
添加A---2  2^2 ==   4 ==   00100
删除B---3  2^3 ==   8 ==   01000
修改B---4  2^4 ==   16 ==   10000
三个值相加就是11100B == 28(D)了

也就是说,让每一个操作权限值都是只有一个1和N个零组成的唯一排列
这样,几个权限相加时就不会出现进位的问题了。保证了每个操作权限都是独立的。
权限值只是一个代号,与大小无关。

3.注意:
(1)一个系统可能有很多的操作,因此,请建立数据字典,以便查阅,修改时使用。
(2)如果用数据库储存用户权限,请注意数值的有效范围。操作权限值请用唯一的整数!
(3)java里一个int是2^32大小,所以不会将权限都分在一个组里,都会分成几个模块,对一个模块用int类型有31个权限分配,一般都可以满足了。建议分组或用大一点的long型。

二、直接用1010........表示
直接用字符串:010101111010011010000.........
判断:0就是没权限,1就是有权限。

分享到:
评论

相关推荐

    vb 转二进制串并运算判断第几位为0

    在权限控制的实现上,可以创建一个枚举类型(Enum)来定义各种权限,每个枚举值对应一个二进制位。这样可以使代码更易读,更直观。例如: ```vb Enum Permissions PermissionNone = 0 Permission1 = 1 ...

    最近再想做权限的控制,写了一个小程序.有兴趣的朋友可以下载看看用二进制做权限设置.

    这个标题提到的“用二进制做权限设置”很可能指的是利用位操作来实现精细的权限控制。位操作在计算机科学中是非常基础且强大的工具,特别是在处理权限标志时,因为它们可以高效地表示和修改各种状态。 在描述中提到...

    mysql 二进制转换工具

    MySQL二进制转换工具主要涉及的是数据库管理和网络安全方面的技术,特别是与数据编码、文件传输以及权限提升相关的操作。在MySQL中,二进制格式通常用于存储和处理原始数据,如图像、音频或自定义文件,因为这些数据...

    二进制AndroidManifest.xml修改神器~

    总结来说,`AndroidManifest.xml`是Android应用的核心配置文件,而AXMLTWOEditor是处理其二进制形式的工具,它为开发者提供了更深层次的控制权,同时也提醒我们注意应用的安全性。对于想要深入探究APK结构或进行逆向...

    图片以二进制存取数据库

    2. 安全性:将图片直接存储在数据库中,可以利用数据库的权限控制和备份机制来保护图片数据。 3. 整合性:将图片与相关的业务数据一起存储,方便进行统一管理和查询。 二、二进制数据类型 在关系型数据库中,通常...

    数据库读取二进制图片显示

    - **安全控制**:防止恶意用户通过直接访问图片的URL来绕过权限验证,可以通过设置HTTP头或使用短链接服务来限制访问。 - **优化查询**:避免全表扫描,利用索引优化图片的查询速度。 总之,数据库读取和显示二进制...

    基于位运算的权限细粒度控制

    在权限控制中,我们通常用一个整数来表示用户的权限集合,每个二进制位代表一种特定的权限。 1. **权限位设计**: 在设计权限系统时,首先需要为每种权限分配一个唯一的二进制位。例如,如果一个系统有五种权限...

    二进制文件部署k8s集群的资源和指南(v1.22)

    本文将详细介绍如何利用二进制文件部署k8s集群,特别是针对v1.22版本。在这个版本中,k8s引入了多项改进和新特性,以提升性能和稳定性。 首先,我们来看二进制部署的优点。这种方法适用于那些希望自定义安装过程,...

    Fabric1.4.4的二进制文件.zip

    Fabric是Hyperledger项目中的一个分布式账本技术(DLT)平台,它专注于为企业提供区块链解决方案。...通过深入理解和充分利用这些二进制文件,开发者可以构建出满足业务需求的定制化区块链解决方案。

    masm工具集(包括教程,指令字典,二进制码查看工具)

    BinView是一个二进制文件查看工具,可以用来查看和分析不同类型的二进制文件,如可执行文件、图片、音频等。它能显示出文件的详细信息,包括文件头、数据结构等,对于理解文件内部结构非常有帮助。 **保护模式编程*...

    二进制部署 + kubernetes + 1.25.5

    2. 安全性:二进制文件应通过安全的通道传输,并考虑使用安全的权限模式和访问控制策略。 3. 回滚策略:建立完善的回滚机制,以便在更新出现问题时迅速恢复到之前的版本。 综上所述,"二进制部署 + Kubernetes + ...

    二进制交叉权限微型php类分享

    本文详细介绍了一个利用二进制和位运算实现的交叉权限管理微型PHP类。通过对二进制原理的理解、PHP新特性的运用以及具体的类实现方法的分析,我们不仅能够了解到如何实现高效的权限管理系统,还能学习到如何在实际...

    Linux二进制漏洞利用——突破系统防御的关键技术.pdf

    《Linux二进制漏洞利用——突破系统防御的关键技术》这篇文献深入探讨了在Linux操作系统中,如何利用二进制漏洞来突破系统级别的安全防御。在金融安全领域,这样的技术至关重要,因为金融系统的安全性直接影响到经济...

    Python读取SD卡二进制数据

    当我们需要从SD卡中读取二进制数据时,这通常涉及到底层I/O操作和二进制文件的理解。在这个场景下,"Python读取SD卡二进制数据"的知识点主要涵盖以下几个方面: 1. **Python与SD卡接口**:在STM32微控制器上,通过...

    Openresty二进制版本(openresty-1.19.9.1-win32.zip)

    - **API网关**:利用OpenResty进行API的路由分发、权限验证、限流控制等。 - **微服务架构**:作为服务发现、熔断、降级的入口,协调多个微服务。 - **动态内容生成**:在Nginx层面处理部分动态请求,减轻后端...

    .net 运用二进制位运算进行数据库权限管理

    总结来说,.NET中利用二进制位运算进行数据库权限管理的优势在于: 1. **效率高**:位运算在计算机底层直接处理,速度非常快。 2. **灵活性强**:可以轻松地组合和检查多种权限。 3. **节省空间**:通过单一的整数值...

    基于WM6.0 的二进制图片问题

    开发者需要使用内存缓冲区或者文件流来处理这些二进制数据。C++或.NET Compact Framework中的数据结构(如byte数组)可以用来存储和操作这些数据。 4. **内存管理**:由于资源限制,Windows Mobile上的内存管理比...

    java基于移位操作实现二进制处理的方法示例

    接下来,`TestBinary`类展示了如何利用移位操作进行二进制处理,特别是用于权限控制的情况。这个类提供了两个静态方法: 1. `getValue(Integer k, int index)`:将十进制数k转换为二进制字符串,然后返回指定index...

    pb权限控制(tag法)

    我们需要5位二进制来表示这些权限。可以编写一个`getbin`函数,将“0”到“f”的字符转换为四位二进制串。当用户登录并验证成功后,权限字符串会被加载到全局变量,随后逐个检查菜单项和按钮的权限,根据`tag`值设置...

Global site tag (gtag.js) - Google Analytics