大家的权限是怎么做的呢?这里为大家介绍一个简单的权限管理方法。

访问控制主要是指按照用户身份和对应的权限来限制用户实施平台资源的使用和控制。通过指定不同的访问策略来控制用户对资源的访问。访问控制保障合法用户访问和授权使用特定的资源,防止非法主体或操作者对平台资源进行非授权的访问。

用户组包含一个或多个用户,它拥有特定的操作权限。一般情况下,用户会被分配不同的用户组中,而不是用户直接对应操作权限。每个用户组我们可以分配其一个 id;权限是具体操作的抽象概念,例如我们赋予 4 = 完全权限、3 = 删除权限、2 = 写入权限、1 = 只读权限、0 = 拒绝(没有权限)。而且权限由最高级到最低级之间可拥有继承的关系;资源指的则是保存在云平台的任何实体。

用户组、权限和资源是云平台访问控制中三个关键元素。应该通过一个什么样的结构和策略表现它们之间的关系呢?下一节将会详细讨论。

实现策略以及具体算法

通过权限矩阵列表可以展现用户组、权限和资源这三者关系,达到了访问控制的目的。

其中 Fi 表示可供访问的资源,Ui 表示用户组,通过二维关系反映了 Ui 用户组对资源 Fi 的权限,例如 U1 对应 F1 的权限是 4,表示拥有完全权限。当前假设 4 = 完全权限、3 = 删除权限、2 = 写入权限、1 = 只读权限、0 = 拒绝(没有权限)。

权限矩阵列表虽然可以清晰反映用户与权限之间的关系,但是实现过程中却带来不少问题。F1 的权限集合实际上是数字列表,如果将其简单保存起来,要考虑几个问题:1、一个权限对应一个用户组,如果用户组线性增长,权限也会随之线性增长,那么如何在数据库中设计出的列来保存权限?无论资源还是用户组,所有都放在一个列或行增加,则会出现 n 个列——那肯定也不合理,势必会违反数据库范式设计。2、用户组一旦发生改版,修改权限列表将涉及查找、删除等操作,都是比较耗时的操作。明显,我们将不能直接将权限矩阵列表简单保存起来,于是我们必须寻求另外一种合适的算法,可以有效而且方便地实现访问控制。

单键锁配置法

单键锁配置法的概念(Single Key-Lock Access Control)改变了传统访问控制的方式,能够使得访问控制变得方便有效。在此方法中不需要存储权限矩阵列表,仅需对每一个用户组 Ui 给定一个键值 Ki,并对每一个资源 Fj 给定一个锁值 Lj,通过运算即可求出 Ui 对 Ki 的访问权限 Rij。当操作者需要访问一个资源时,云平台系统会将操作者所在的用户组键值 Ki 与资源所对应的锁值 Lj,然后系统使用键锁配置技术求出所对应的访问权限 Rij,判断是否接受用户的访问请求。

这样,从数据库角度讲,资源表保存只需要一个字段保存锁值 Lj;用户组表只需要保存一个字段 Ki。

那么单键锁配置法的算法具体如何呢?利用“将一整数分解成质因数的乘积是唯一的特性”即可实现单键锁配置法。例如是 360 此值唯一的质因数表达式,其中 2、3、5 都是质数。

上面粗略介绍了单键锁配置法,现在结合此算法特性在详细解释。首先系统必须给予每个用户组一个键值,每一个资源一个锁值。其中每一个键值的 Ki 是不同的质数,锁值 Lj 是由键值计算所得。最后 Rij 表示权限矩阵列表中的权限值。如果用户 Ui 对资源 Fj 发出访问请求,先根据用户找到其所在的用户组,然后云平台可以通过下面算法来验证用户的访问权是否合法。

输入参数:用户组 Ui 的键值 Ki,资源 Fj 的锁值 Lj。

输出结果:用户组 Ui 对资源 Fj 的访问权限 Rij。

步骤1:输入 Ki 和 Lj

步骤2:设 Rij = 0,Temp = Lj。

步骤3:计算 Q=Temp/Ki。如果 Q是整数则 Rij++, Temp = Q;重复该步骤直到 Q 不是整数或者 Rij= Rmax。Rmax 是所在权限值的最大值。

步骤4:输出权限值 Rij。

关于资源锁值 Lj 是怎么求得呢?继续使用权限矩阵列表如下。

首先给予每一个用户组的键值 Ki 不同的质数,令 K1=2,K2=3,K3=5,K4=7,K5=11。按 F1 的权限值由上至下作为指数求出锁值:L1= =15120,L2=29106000,L3=686070,……。当用户U1要对资源F1访问时,系统可以找出对应的键 K1 和锁值 L1 来校验是否合法。

测试验证

伪代码验证如下:

int Rmax = 4; // 权限值的最大值int getR(int Ki, int Lj) {int Rij = 0, Temp = Lj;Number Q; // Number 类型可以包含整数或浮点数while(true){if(Rij == Rmax)break;Q = Temp/Ki;if(isInt(Q)){ //  isInt() 判断是否整数Rij++;Temp = Q;} else break;}return Rij;}

附:Java 生成任何整数的因子 https://www.oschina.net/code/snippet_778875_16087

import java.util.*;public class ZYS {/*** 分析这个数是不是质数* * @param num*/public static boolean isZhishu(int num) {switch (num) {case 1:case 2:case 3:return true;}int temp = 0;for (int i = 2; i < num / 2 + 1; i++) {if (num % i == 0) {temp++;break;}}if (temp != 0)return false;return true;}/*** 得到一个数所有的因数* * @param num* @return*/public static List<Integer> zhengChu(int num) {List<Integer> integers = new ArrayList<Integer>();for (int i = 2; i < num / 2; i++) {if (num % i == 0)integers.add(i);}return integers;}/*** * @param args*/public static void main(String[] args) {int num = 686070;Set<Integer> integers = new HashSet<Integer>();Set<Integer> integers2 = test(num, integers);System.out.println(integers2);}/*** 正式求解* * @param num* @param data* @return*/public static Set<Integer> test(int num, Set<Integer> data) {if (data == null)data = new HashSet<Integer>();if (isZhishu(num)) {
//          System.out.println(nu÷m);data.add(num);} else {List<Integer> temp = zhengChu(num);for (Integer integer : temp) test(integer, data);}return data;}}

通过“单键锁配置法”实现访问控制相关推荐

  1. 一种单键开/关机电路,实现手机电源键功能:长按开机、长按关机、轻触开/锁屏

    分享一个自己电路中的 单键开关机电路,需要与单片机的I/O配合,可实现手机电源键功能,如:长按开机.长按关机.轻触开关锁屏或其他自定义功能.并且静态功耗极低,最大uA级,非常适合电池供电. 一.电路如 ...

  2. 应广单片机长按开关机_单片机单键开关机电路,模仿手机电源键功能 - 实现长按开机、长按关机、轻触开关锁屏...

    分享一个自己电路中的 单键开关机电路,需要与单片机的I/O配合,可实现手机电源键功能,如长按开机.长按关机.轻触开关锁屏或其他自定义功能.并且静态功耗极低,最大uA级,非常适合电池供电. 电路需求 电 ...

  3. java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

    目录 1.前言 2.单JVM锁 3.分布式锁 4.总结 =========正文分割线================= 1.前言 锁就像一把钥匙,需要加锁的代码就像一个房间.出现互斥操作的典型场景:多 ...

  4. MySQL怎么运行的系列(十)Innodb中的锁:记录锁、临键锁、间隙锁、意向锁

    本系列文章目录 展开/收起 MySQL怎么运行的系列(一)mysql体系结构和存储引擎 MySQL怎么运行的系列(二)Innodb缓冲池 buffer pool 和 改良版LRU算法 Mysql怎么运 ...

  5. [置顶] 单键模式的C++描述

    设计模式-单键(Signelton):其实单键的设计模式说来很简单,说的直白一点就是程序运行过程中保证只有一个实例在运行而已.在软件系统中,经常有这样一些特殊的类,必须保证它们在系统中只存在一个实例, ...

  6. 使用复合索引代替单键索引,来避免单键有null值的情况

    查看原表: SQL> select count(*) from t1;COUNT(*) ----------3229088SQL> select count(*) from t1 wher ...

  7. MySQL(七)关于MySQL不同版本下临键锁锁定范围不同

    MySQL InnoDB底层的锁实现算法分为三种 : 记录锁,间隙锁,临键锁. 之前在验证MySQL的临键锁的时候使用docker安装的最新版本的MySQL镜像,发现其临键锁在最新的MySQL的表现和 ...

  8. android 模拟长按菜单键_如何采用PLC梯形图实现单键启动程序

    "PLC是一种专门为在工业环境下应用而设计的数字运算操作的电子装置.它采用可以编制程序的存储器,用来在其内部存储执行逻辑运算.顺序运算.计时.计数和算术运算等操作的指令,并能通过数字式或模拟 ...

  9. 索引利弊,如何创建索引,单键索引还是组合索引

    ** 索引的利弊与如何判定,是否需要索引** 相信读者都知道索引能够极大地提高数据检索的效率,让Query 执行得更快,但是可能并不是每一位朋友都清楚索引在极大提高检索效率的同时,也给数据库带来了一些 ...

最新文章

  1. OutputFormat接口实现类
  2. SQL Server 2008 正式版安装指南(附序列号)
  3. 使用ifstream和getline读取文件内容[c++]
  4. 后台接收富文本内容报错ParserException: syntax error
  5. 深度学习(15)TensorFlow高阶操作四: 填充与复制
  6. python用generator打印杨辉三角_python写generator输出杨辉三角遇到问题,望高手解答!...
  7. Latex WinEdt7.0查找替换功能
  8. Python 微信自动化工具开发系列03_自动向微信好友发送信息和文件(2022年10月可用)
  9. 恢复计算机注册表命令,恢复电脑注册表的方法
  10. VR全景有什么应用,和传统摄影的区别,发展前景如何?
  11. iOS(iPhone,iPad))开发(Obje…
  12. CTP开发(1)CTP开发的概述
  13. 如何解决java中的安全问题_如何解决java中“使用了未经检查或不安全的操作 请使用 -Xlint:unchecked 重新编译 ”的问题...
  14. 选拔赛A题“一个部族,一个民族,一个弗雷尔卓德。”
  15. 计算机声音取消外放,电脑怎么设置取消外音
  16. 软件交付_交付更好软件的最佳建议(来自我的导师)
  17. ELK日志分析平台(三)— kibana数据可视化、kibana监控、采集日志插件filebeat
  18. NOIP考前复习内容
  19. plc与单片机都有什么不同?
  20. AI产品经理需要了解的线性代数通识

热门文章

  1. 苹果蓝牙耳机平替哪个好用?苹果蓝牙耳机平替推荐
  2. 7-3 垃圾分类 (20分)
  3. chrome浏览器删除一些自动出现的书签
  4. Smartphone--Android真机管理平台
  5. linux indent添加,linux indent格式化代码
  6. 实验二 实现中点分割直线段裁剪算法
  7. java xtend_Java加上Xtend,满足你对C#语法的所有想象 | 学步园
  8. STM32的RS485通信
  9. 29. 尚融宝借款申请
  10. python编程趣味试题_python趣味编程100例 python编程100例