微服务与Nacos概述-6

RBAC 模型

RBAC 基于角色的访问控制是实施面向企业安全策略的一种有效的访问控制方式。

基本思想是,对系统操作的各种权限不是直接授予具体的用户,而是在用户集合与权限集合之间建立一个角色集合。每一种角色对应一组相应的权限。一旦用户被分配了适当的角色后,该用户就拥有此角色的所有操作权限。这样做的好处是,不必在每次创建用户时都进行分配权限的操作,只要分配用户相应的角色即可,而且角色的权限变更比用户的权限变更要少得多,这样将简化用户的权限管理,减少系统的开销。

在这里插入图片描述

权限可分为三类:数据权限、操作权限和页面权限。

1、数据权限:控制账号可看到的数据范围。例如负责不同区域的人员,只能看到自己负责区域的标的,不能看到和修改其他区域的。

2、页面权限:控制账号可以看到的页面,通常系统都会有这一层权限控制。这种控制相对操作权限来说比较粗放,难以对权限进行精细管理。

3、操作权限:控制账号在页面上可以操作的按钮,通常指的是页面中的新增、删除、编辑、查询功能。没有操作权限,就只能看到页面中的数据,但是不能对数据进行操作。操作权限是比页面权限更精细一层的权限控制。

基础概念

RBAC 模型根据设计需要可分为 RBAC0、RBAC1、RBAC2、RBAC3 四种类型。其中 RBAC0 是基础,另外三种是 RBAC0 的升级。产品经理在进行权限系统设计时,可以结合实际情况来选择使用的 RBAC 模型的类型。

RBAC0 是 RBAC 模型的核心基础思想,即用户通过被赋予角色和权限进行关联。用户、角色和权限之间的两两关系均是多对多关系,即一个用户可以被赋予多个角色,一个角色可以被赋予多个用户。一个角色可以拥有多项权限,一项权限可以赋予多个角色。

RBAC1 是引入继承关系的 RBAC 模型,一个角色可以从另一个角色继承许可权,即角色具有上下级的关系。角色间的继承关系可分为一般继承关系和受限继承关系。一般继承关系允许角色间的多继承,受限继承关系则进一步要求角色继承关系是一个树结构

RBAC-2 模型在用户与角色间和角色与角色之间加入了一些规则限制。互斥角色是指各自权限可以互相制约的两个角色。且不能同时获得两个角色的使用权。规定了权限被赋予角色时或角色被赋予用户时所应遵循的强制性规则。角色互斥、基数约束、先决条件角色等

互斥角色:同一用户在两个互斥角色中只能选择一个。例如不能同时被指派给会计角色和审计员角色

先决条件角色 :指要想获得较高的权限要首先拥有低一级的权限。例如要想为用户分配角色 A,则必须先分配角色 B

基数约束:一个角色被分配的用户数量受限;一个用户可拥有的角色数目受限

运行时互斥:允许一个用户具有两个角色,但在运行中不可同时激活这两个角色。

RBAC3 统一模型:同时包含 RBAC1 和 RBAC2 的特性,既有角色层级划分,也有各种限制

表定义

在这里插入图片描述

系统的 RBAC 相关表的定义

create table if not exists tbl_users(
    id bigint primary key,
    foreign key(id) references tbl_account on delect cascade,
    username varchar(32) not null unique,
    password varchar(32) not null,
    salt varchar(32) comment '盐值',
    iter int default 6 comment '加密次数'
)engine = innodb default charset utf8 comment '登录账户信息';

create table if not exists tbl_roles(
    id bigint primary key auto_increment comment '代理主键',
    name varchar(32) not null,
    descn varchar(255) comment '备注说明,一般在具体表中会创建一些看起来似乎没有什么用的列' 
)egine = innodb default charset utf8 comment '角色信息';

一般在管理系统中,针对普通用户的权限管理是通过菜单项是否显示来实现的,当然服务器端会针对用户的请求进行权限验证

在这里插入图片描述

无限级分类的实现方法为 自关联表

create table if not exists tbl_permissions(
    id bigint primary key auto_increment,
    parent_id bigint,
    foreign key(parent_id) references tbl_persimissions(id) on delete cascade
) engine = innodb default charset utf8;

一般为了简化编码,还会引入一些额外列定义,例如 level 层级、是否具有孩子节点、孩子节点个数等

create table if not exists tbl_permissions(
    id bigint primary key auto_increment,
    parent_id bigint,
    foreign key(parent_id) references tbl_persimissions(id) on delete cascade,
    title varchar(32) not null comment'菜单项名称',
    url varchar(64) comment '对应的URL地址',
    descn comment '特别重要的列,用于表示访问当前菜单所需要的权限字符串,例如user:query:1',
    is_child boolean default  comment '额外列,用于表示是否叶子节点,还经常添加一些其它的列'
)engine=innodb default charset utf8;

create table if not exists tbl_role2permission(
    role_id bigint not null,
    permission_id bigint not null,
    primary key(permission_id,role_id),
    foreign key(permission_id) references tbl_permissions on delete cascade,
    foreign key(role_id) references tbl_roles on delete cascade
)engine=innodb default charset utf8;

补充:

1、具体权限是否对应到菜单取决于控制等级,如果需要控制到按钮级,则菜单和权限之间多对多关联

2、考虑具体的业务规则,是否有临时授予用户某些权限的可能,如果有则还需要在用户表和权限表之间建立多对多关联

3、是否有用户组

JSON 响应结果

Json 响应枚举类型

public enum ResponseEnum { //列举出本系统业务上的所有的可能情况
    SUCCESS(200, "成功" ), ERROR(500, "发生未知错误,请联系管理员" )
    USERNAME_OR_PASSWORD_INVALIDATE(301, "用户名或者密码错误" ), 
    HAVE_NO_RIGHTS(302, "该角色还没有被赋权,请联系管理员" ), 
    NO_LOGIN(303, "还没有登录" ), 
    LOGIN_SUCCESS(304, "登录成功" ),
    TOKEN_INVALID(305, "token 无效,请先登录" ), 
    TOKEN_EXPIRE(306, "token 已经超时,请重新登录" ), 
    USER_STATUS_ERROR(307, "用户已封禁" ), 

    private int code;
    private String message;
}
public class JsonResult {
    private int code;
    private Boolean success;
    private String message;
    private Object data;
    public JsonResult(ResponseEnum responseEnum, Object data ) {
        this.code = responseEnum.getCode( );
        this.message = responseEnum.getMessage( );
        this.data = data;
    }
}

补充说明

1、用户组设置。一般来说权限管理系统不需要设置用户组,只要当用户基数较大,角色类型过多时,为了便于管理员进行操作,才会引入用户组的概念。用户组可以理解为,将某个部门的所有人看成一个用户组,再给用户组赋予角色,这个部门的所有人就都有了用户组中角色的权限。对于给群体账号赋予权限,用户组可以提供很大的便利。同时用户组中的账号,除拥有用户组的权限外,还可以拥有指定的角色。

账号管理

账号管理模块是对系统用户的信息进行管理,在列表中要展示重要性较高的字段,便于识别账号。如编号、真实姓名、用户名、部门、角色、创建时间、账号状态等。需要能通过真实姓名和用户名来查询账号,便于管理员定位到想要操作的账号。除此之外,还需要有新建账号功能
在这里插入图片描述

新建账号功能可跳转页面或弹窗展示,页面信息除账号基本信息外,还需要对账号赋予角色
在这里插入图片描述

除了需要创建新账号外,还需要对已有的账号进行修改,账号用户的真实姓名和用户名不可修改,其他信息可修改
在这里插入图片描述

角色管理

角色即为拥有共同特征的同一类人群身份的归纳,所以在角色管理页面中,需要设置能够识别角色特征的字段。如角色名称、角色描述、创建时间、更新时间、状态等。角色数量通常不会太多,数量较少时可取消查询功能,但新建角色功能是必不可少的。
在这里插入图片描述

新建角色即是对角色进行描述并赋予权限的过程,若权限数量不多,可采用下拉列表的方式选择。若权限数量多且分类繁杂,则可采用分组列表的方式展示,让用户通过复选框勾选。为了操作简便,建议增加全选/反选功能。

在这里插入图片描述

操作栏中的编辑功能,对已有角色进行修改,角色的名称、描述、状态、权限均可修改,每次修改后在列表中记录更新时间

在这里插入图片描述

对应账号指的是配置过该角色的账号,点击后在新页面中打开,展示账号信息,包括账号的真实姓名、用户名、部门、创建时间、账号状态,并可在列表中对账号进行编辑。

在这里插入图片描述

权限管理

若系统中权限数量较多且权限类型复杂(页面权限、操作权限、数据权限),为了保证管理员使用便捷及减低出错概率,可以将权限管理页面以列表的形式展示,展示页面包含权限编号、名称、类型、描述、创建时间等。若系统权限较为简单,则可用树状图来展示权限,不需要对权限做过多描述。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/82190.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2023年网络安全比赛--综合渗透测试(超详细)

一、竞赛时间 180分钟 共计3小时 二、竞赛阶段 竞赛阶段 任务阶段 竞赛任务 竞赛时间 分值 1.扫描目标靶机将靶机开放的所有端口,当作flag提交(例:21,22,23); 2.扫描目标靶机将靶机的http服务版本信息当作flag提交(例:apache 2.3.4); 3.靶机网站存在目录遍历漏洞,请将…

正则表达式在PHP8中的应用案例-PHP8知识详解

正则表达式在php8中有许多应用案例。以下是一些常见的应用场景:如数据验证、数据提取、数据替换、url路由、文本搜索和过滤等。 1、数据验证 使用正则表达式可以对用户输入的数据进行验证,例如验证邮箱地址、手机号码、密码强度等。 下面是一个用正则表…

Source Insight配置Cppcheck做静态测试(Windows)

1.安装cppcheck 先从cppcheck官方网站下载cppcheck的安装包。 注: (1)官网地址:https://sourceforge.net/projects/cppcheck (2)截止2023年8月,官方发布的最新版本是cppcheck-2.11-x64-Setup.…

第8步---MySQL的存储过程和触发器

第8步---MySQL的存储过程和触发器 1.存储过程 5开始支持的 sql集,类似Java中的代码中的方法 实现对sql的封装和服用 有输入和输出 可以声明变量 可以实现一下复杂的控制语句 1.1入门案例 基本语法 测试数据 -- 创建表的测试数据 create table dept(deptno int pri…

什么是合成数据(Synthetic Data)?

关于合成数据您需要知道的一切 推出人工智能(AI)的企业在为其模型采集足够的数据方面会遇到一个主要障碍。对于许多用例来说,正确的数据根本不可用,或者获取数据非常困难且成本高昂。在创建AI模型时,数据缺失或不完整…

葡萄目标检测(yolov8模型,无需修改路径,python代码,解压缩后直接运行)

运行效果视频:葡萄目标检测(yolov8模型,无需修改路径,python代码,解压缩后直接运行)_哔哩哔哩_bilibili 1.采用yolov8模型 models文件夹保存的是yolov8的训练好的模型参数 PinotNoir文件夹存放的是训练集 …

Flink学习笔记(一)

流处理 批处理应用于有界数据流的处理,流处理则应用于无界数据流的处理。 有界数据流:输入数据有明确的开始和结束。 无界数据流:输入数据没有明确的开始和结束,或者说数据是无限的,数据通常会随着时间变化而更新。 在…

透过源码理解Flutter中widget、state和element的关系

1、framework源码组成 Flutter中widget、state、element的源码位于framework.dart中,整个文件6693行(版本Flutter 3.12.0-14.0.pre.28)。整个代码可划分为若干部分,主要包括key、widget、state、element四部分。 1.1 key 关于key的代码65行到272行&am…

8.3.tensorRT高级(3)封装系列-tensor封装,索引计算,内存标记及自动复制

目录 前言1. Tensor封装总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程,之前有看过一遍,但是没有做笔记,很多东西也忘了。这次重新撸一遍,顺便记记笔记。 本次课程学习 tensorRT 高级-tensor封装,索引计算&a…

【Spring系列篇--关于IOC的详解】

目录 面试经典题目: 1. 什么是spring?你对Spring的理解?简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。 2.什么是IoC?你对IoC的理解?IoC的重要性?将实例化对象的权利从程序员…

echart 3d立体颜色渐变柱状图

如果可以实现记得点赞分享,谢谢老铁~ 1.需求描述 根据业务需求将不同的法律法规,展示不同的3d立体渐变柱状图。 2.先看下效果图 3. 确定三面的颜色,这里我是自定义的颜色 // 右面生成颜色const rightColorArr ref(["#79D…

自动驾驶仿真:基于Carsim开发的加速度请求模型

文章目录 前言一、加速度输出变量问题澄清二、配置Carsim动力学模型三、配置Carsim驾驶员模型四、添加VS Command代码五、Run Control联合仿真六、加速度模型效果验证 前言 1、自动驾驶行业中,算法端对于纵向控制的功能预留接口基本都是加速度,我们需要…

git环境超详细配置说明

一,简介 在git工具安装完成之后,需要设置一下常用的配置,如邮箱,缩写,以及git commit模板等等。本文就来详细介绍些各个配置如何操作,供参考。 二,配置步骤 2.1 查看当前git的配置 git conf…

解决ios隔空播放音频到macos没有声音的问题

解决ios隔空播放音频到macos没有声音的问题 一、检查隔空播放支持设备和系统要求二、打开隔空播放接收器三、重置MAC控制中心进程END 一、检查隔空播放支持设备和系统要求 Mac、iPhone、iPad 和 Apple Watch 上“连续互通”的系统要求 二、打开隔空播放接收器 ps;我设备是同一…

基于web的停车场收费管理系统/基于springboot的停车场管理系统

摘 要 随着汽车工业的迅猛发展,我国汽车拥有量急剧增加。停车场作为交通设施的组成部分,随着交通运输的繁忙和不断发展,人们对其管理的要求也不断提高,都希望管理能够达到方便、快捷以及安全的效果。停车场的规模各不相同,对其进行管理的模…

剪枝基础与实战(3): 模型剪枝和稀疏化训练流程

Model Pruning 相关论文:Learning Efficient Convolutional Networks through Network Slimming (ICCV 2017) 考虑一个问题,深度学习模型里面的卷积层出来之后的特征有非常多,这里面会不会存在一些没有价值的特征及其相关的连接?又如何去判断一个特征及其连接是否有价值? …

redis实战-缓存数据解决缓存与数据库数据一致性

缓存的定义 缓存(Cache),就是数据交换的缓冲区,俗称的缓存就是缓冲区内的数据,一般从数据库中获取,存储于本地代码。防止过高的数据访问猛冲系统,导致其操作线程无法及时处理信息而瘫痪,这在实际开发中对企业讲,对产品口碑,用户评价都是致命的;所以企业非常重视缓存…

【汇编语言】使用DS和[address]实现字的传送

文章目录 要解决的问题:CPU从内存单元中读取数据字的传送 要解决的问题:CPU从内存单元中读取数据 1、要求:CPU要读取一个内存单元时,必须先给出这个内存单元的地址; 2、原理:8086设备中,内存地…

LeetCode--HOT100题(35)

目录 题目描述:23. 合并 K 个升序链表(困难)题目接口解题思路1代码解题思路2代码 PS: 题目描述:23. 合并 K 个升序链表(困难) 给你一个链表数组,每个链表都已经按升序排列。 请你将所有链表合…

git压缩/合并多次commit提交为1次commit提交

git压缩/合并N次commit提交为1次commit提交 假设有最近3次提交: commit_id1 commit_id2 commit_id3目标是把以上3次commit合并成1个commit,注意,最新的commit提交在最上面。 在git bash里面的操作步骤: (1&#xff0…
最新文章