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

本文涉及的产品
访问控制,不限时长
简介: 大家的权限是怎么做的呢?这里为大家介绍一个简单的权限管理方法。访问控制主要是指按照用户身份和对应的权限来限制用户实施平台资源的使用和控制。通过指定不同的访问策略来控制用户对资源的访问。

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

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

用户组包含一个或多个用户,它拥有特定的操作权限。一般情况下,用户会被分配不同的用户组中,而不是用户直接对应操作权限。每个用户组我们可以分配其一个 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;
    }

}
相关实践学习
消息队列+Serverless+Tablestore:实现高弹性的电商订单系统
基于消息队列以及函数计算,快速部署一个高弹性的商品订单系统,能够应对抢购场景下的高并发情况。
云安全基础课 - 访问控制概述
课程大纲 课程目标和内容介绍视频时长 访问控制概述视频时长 身份标识和认证技术视频时长 授权机制视频时长 访问控制的常见攻击视频时长
目录
相关文章
|
22天前
|
网络虚拟化 数据安全/隐私保护 数据中心
对比了思科和华为网络设备的基本配置、接口配置、VLAN配置、路由配置、访问控制列表配置及其他重要命令
本文对比了思科和华为网络设备的基本配置、接口配置、VLAN配置、路由配置、访问控制列表配置及其他重要命令,帮助网络工程师更好地理解和使用这两个品牌的产品。通过详细对比,展示了两者的相似之处和差异,强调了持续学习的重要性。
31 2
|
2月前
|
网络协议 网络虚拟化 数据安全/隐私保护
访问控制列表(ACL)配置
访问控制列表(ACL)配置
访问控制列表(ACL)配置
|
2月前
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
|
3月前
|
Apache 数据安全/隐私保护
HAProxy的高级配置选项-ACL篇之基于源地址访问控制案例
这篇文章介绍了HAProxy的ACL(访问控制列表)功能,特别是如何基于源地址进行访问控制的高级配置选项,并通过实战案例展示了如何配置ACL规则以允许或阻止特定IP地址或IP范围的访问。
58 7
HAProxy的高级配置选项-ACL篇之基于源地址访问控制案例
|
3月前
|
Apache 数据安全/隐私保护
HAProxy的高级配置选项-ACL篇之基于策略的访问控制
这篇文章介绍了HAProxy的高级配置选项,特别是如何使用ACL(访问控制列表)进行基于策略的访问控制,通过实战案例展示了如何配置HAProxy以允许或拒绝来自特定源地址的访问。
71 6
HAProxy的高级配置选项-ACL篇之基于策略的访问控制
ly~
|
3月前
|
消息中间件 搜索推荐 大数据
一般情况下在 RocketMQ 中添加 access key 的步骤: 一、确定配置文件位置 RocketMQ 的配置文件通常位于安装目录下的 conf 文件夹中。你需要找到 broker.conf 或相关的配置文件。 二、编辑配置文件 打开配置文件,查找与 ACL(访问控制列表)相关的配置部分。 在配置文件中添加以下内容:
大数据广泛应用于商业、金融、医疗和政府等多个领域。在商业上,它支持精准营销、客户细分及流失预测,并优化供应链管理;金融领域则利用大数据进行风险评估、市场预测及欺诈检测;医疗行业通过大数据预测疾病、提供个性化治疗;政府运用大数据进行城市规划和公共安全管理;工业领域则借助大数据进行设备维护、故障预测及质量控制。
ly~
143 2
|
3月前
|
NoSQL 关系型数据库 MySQL
HAProxy的高级配置选项-haproxy的四层负载及访问控制案例
这篇文章介绍了HAProxy的高级配置选项,特别是如何进行四层负载均衡和基于策略的访问控制。通过实战案例,展示了如何配置HAProxy以实现对特定IP地址的访问控制,以及如何通过四层负载均衡将流量分配到后端的MySQL和Redis服务。
153 6
|
4月前
|
安全 Nacos 数据库
【技术安全大揭秘】Nacos暴露公网后被非法访问?!6大安全加固秘籍,手把手教你如何保护数据库免遭恶意篡改,打造坚不可摧的微服务注册与配置中心!从限制公网访问到启用访问控制,全方位解析如何构建安全防护体系,让您从此告别数据安全风险!
【8月更文挑战第15天】Nacos是一款广受好评的微服务注册与配置中心,但其公网暴露可能引发数据库被非法访问甚至篡改的安全隐患。本文剖析此问题并提供解决方案,包括限制公网访问、启用HTTPS、加强数据库安全、配置访问控制及监控等,帮助开发者确保服务安全稳定运行。
403 0
|
4月前
|
应用服务中间件 nginx 数据安全/隐私保护
nginx配置源IP访问控制
nginx配置源IP访问控制
|
7月前
|
网络虚拟化 数据安全/隐私保护 数据中心
【专栏】对比了思科与华为网络设备的基本配置、接口、VLAN、路由、访问控制列表及其它关键命令
【4月更文挑战第28天】本文对比了思科与华为网络设备的基本配置、接口、VLAN、路由、访问控制列表及其它关键命令。尽管两者在很多操作上相似,如设备命名(思科:`hostname`,华为:`sysname`)、查看版本信息(思科:`show version`,华为:`display version`),但在某些方面存在差异,如接口速率设置(两者都使用`speed`和`duplex`,但命令结构略有不同)和VLAN配置(华为的`port hybrid`命令)。
512 0