这里笔者介绍一种很常用,也比较专业的权限控制思路。这里用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;
}
当然,多权限的验证只要扩展一下就可以了。
几点注意事项:首先,一个系统可能有很多的操作,因此,请建立数据字典,以便查阅,修改时使用。其次,如果用数据库储存用户权限,请注意数值的有效范围。操作权限值请用唯一的整数!
以上内容转自互联网
下面贴出完整代码
package com.firesoft.zm.purview;
/**
* 基于位运算的权限细粒度控制
* @author 左明 2010-01-14 12点半
* @version 1.0
* @email zuoming_99@163.com
* @taobao http://shop59978811.taobao.com/
*/
public class Purview {
private static int I = 0;
//这些权限数值可以取自码表或者其他地方
public static final int READ = ++I;
public static final int WRITE = ++I;
public static final int MOVE = ++I;
public static final int DELETE = ++I;
public static final int A = ++I;
public static final int B = ++I;
public static final int C = ++I;
// and more ...
public static final int MAX = 30;//最大不能超过30
/**
* 转换后的权限值,用于存储
*/
private int purview;
/**
* 构造函数,指定权限列表构造权限对象
* @param values 权限数值列表
*/
public Purview(int...values){
int v = pur(values[0]);
for(int i=1,l=values.length; i<l; i++){
v += pur(values[i]);
}
this.purview = v;
}
/**
* 判断当前权限对象是否有<b>指定权限[列表]</b>中所有权限
* @param values 指定权限[列表]
* @return boolean true:是,false:否
*/
public boolean has(int...values){
int p = pur(values[0]);
for(int i=1,l=values.length; i<l; i++){
p += pur(values[i]);
}
return p == (this.purview & p);
}
/**
* 计算次方
* @param p 次方
* @return int 2^p次方
*/
private static int pur(int p){
return (int)Math.pow(2, p);
}
/**
* 获取实际的权限数值
* @return int 实际的权限数值
*/
public int getPurviewValue(){
return this.purview;
}
}
测试代码:
package com.firesoft.zm.purview;
public class Tester {
/**
* 测试方法
*/
public static void main(String[] args) {
Purview pw = new Purview(Purview.READ, Purview.WRITE, Purview.MOVE);
System.out.println("转换后的权限数值:"+pw.getPurviewValue());
if(pw.has(Purview.READ)){
System.out.println("[有打开权限] ");
}else{
System.err.println("[没有打开权限!] ");
}
if(pw.has(Purview.WRITE)){
System.out.println("[有写入权限] ");
}else{
System.err.println("[没有写入权限!] ");
}
if(pw.has(Purview.MOVE)){
System.out.println("[有移动权限] ");
}else{
System.err.println("[没有移动权限!] ");
}
if(pw.has(Purview.DELETE)){
System.out.println("[有删除权限] ");
}else{
System.err.println("[没有删除权限!] ");
}
if(pw.has(Purview.READ, Purview.WRITE, Purview.MOVE)){
System.out.println("[有读、写、移动权限]");
}else{
System.err.println("[没有读、写、移动权限!]");
}
}
}
分享到:
相关推荐
第一种方案是通过建立多个权限表来实现细粒度的权限控制。在本例中,我们可以创建读权限表、写权限表、编辑权限表和删除权限表,分别记录哪些角色对哪些文章有对应的权限。每个表包含字段如`id`、`role_id`和`...
同时,该方案具备隐藏访问结构的能力,通过细粒度访问控制,能够根据数据拥有者的请求动态管理用户访问权限。这种动态管理机制对于保护患者的隐私数据有着重要的意义。 综上所述,文章详细阐述了一种云计算环境下的...
在云计算的大数据应用中,细粒度访问控制能够在不牺牲系统灵活性的前提下,对访问权限进行精细化管理。FGAC通过设定严格的访问控制策略,确保了数据访问的安全性和准确性。在本文中,作者分析了松耦合下的细粒度访问...
总结起来,这个PHP会员权限控制系统基于位运算和灵活的类结构,实现了细粒度的权限分配和检查。通过这种方式,开发者可以在不修改核心代码的情况下,轻松地调整和管理用户的访问权限,从而提高系统的安全性和用户...
这种灵活性使得ABAC能够处理云环境中的动态变化和细粒度访问需求。 接着,文章指出现有的策略合成方法存在局限,如McLean的代数合成方法适用于对主体安全等级要求高的强制访问控制模型,但不适用于云环境中的低安全...
在这样的背景下,基于雾节点的分布式属性基加密方案应运而生,它旨在解决现有云存储系统中存在的访问控制局限性,如用户权限划分过于笼统、细粒度访问控制不足以及单授权机构可能导致的单点失效问题。 雾计算作为一...
2. **物联网安全:** 在智能设备间的数据交换中,CP-ABE可以实现对数据传输的细粒度控制。 3. **医疗信息保护:** 在医疗保健系统中,只有具备相应授权的医生或护理人员才能查看病人的医疗记录。 4. **数字版权管理...
在此基础上,PB-MUFHE还支持细粒度的访问控制,它确保了只有拥有正确属性的用户才能对数据进行特定操作。方案的安全性分析证明它能够抵御共谋攻击,并且在基于学习有误差(Learning With Errors, LWE)困难度假设的...
Wang等人的方案则关注了恶意用户的属性撤销,提供了更细粒度的访问控制。 尽管这些改进有所进展,但依然需要解决加密过程的效率和依赖性问题。因此,文中提出的云环境下基于可问责属性即可撤销的加密方案,旨在降低...
针对这一问题,本篇文章提出了一种创新的细粒度存储方案——ACSBPA(代理重加密的细粒度访问控制模型),旨在优化批量可信认证过程中的数据安全问题。 ACSBPA模型通过代理重加密技术的优化应用,有效减少了多权限云...
2. **Authorization(授权)**: 授权是指确定用户是否有权限访问特定资源,Shiro 支持角色与权限的细粒度控制,可以根据角色、权限进行访问控制。 3. **Cryptography(加密)**: Shiro 提供了多种加密工具,包括...
此外,这个概念提供了σ次细粒度访问控制,即云服务提供商可以限制特定用户组在特定时间内最多只能享受有限次数的访问权限。同时,这个概念还具有抵抗密钥泄露的能力,即即使用户解密密钥泄露,恶意第三方也无法利用...
在SAP ABAP编程中,`AUTHORITY-CHECK`语句是用于权限检查的关键命令,它确保只有具有适当权限的用户才能执行...开发者需要根据SAP授权概念和具体业务需求,合理配置`AUTHORITY-CHECK`语句,以实现细粒度的权限控制。
2. **精细的权限控制**:通过Acl(Access Control List)实现对资源的细粒度访问控制。 3. **CSRF防护**:内置CSRF(跨站请求伪造)防护,增强Web应用的安全性。 4. **会话管理**:提供会话固定攻击防护和会话超时...
总的来说,这个项目展示了如何在Kotlin和SpringBoot环境中利用Apache Shiro实现细粒度的权限控制,并确保用户密码的安全性。这为开发者提供了一个良好的学习案例,帮助他们更好地理解和应用安全框架。