通用权限管理模型

简介: 本文介绍了ACL和RBAC两种常见权限模型。ACL通过直接为用户或角色授权实现控制,简单直观;RBAC则基于角色分配权限,解耦用户与权限关系,更易管理。文中还详解RBAC的四类扩展模型(RBAC0-RBAC3),涵盖角色继承、职责分离等核心设计,帮助构建清晰的权限体系。

笔者的学习认知中,对于一个新框架往往都会先去学习一下底层模型(即表结构及关系),因此这里我们就来了解一下通用的权限管理有哪些,各自的模型关系大概是什么样子,好对我们接下来的学习有个全局认知。

除了本节讲解的ACL、RBAC,还有一些的DAC、MAC、ABAC,感兴趣的读者们可以自行了解一下。

ACL权限模型

ACL(Access Control List)访问控制列表,是很古老的一个权限控制模型。核心思路:将某个对象的某种权限授予某个用户或某种角色,他们之间的关系是多对多,即一个用户/角色可以具备某个对象的多种权限,某个对象的权限也可以被多个用户/角色所持有。

ACL使用非常简单,在搞明白原理之后,开发者可以不用任何权限框架就可以快速实现ACL权限模式。当然Spring Security也为ACL提供了相应的依赖:spring-security-acl,如果项目有使用可以直接添加此依赖。

RBAC权限模型

RBAC(Role-based access control)基于角色的访问控制,是一种较新且广为使用的权限控制机制,这种机制不是直接给用户赋予权限,而是将权限赋予角色。(看到这读者们是不是觉得跟ACL有相似之处呢)

RBAC将用户按角色进行归类,通过用户的角色来确定用户对某项资源是否具备操作权限。RBAC简化了用户与权限的管理,它将用户与角色关联、角色与权限关联、权限与资源关联,这种模式使得用户的授权管理变得非常简单和易于维护。RBAC权限模型有三个主要原则:

(1)最小权限:给角色配置的权限是其完成任务所需要的最小权限集合

(2)职责分离:通过相互独立互斥的角色来共同完成任务,即不能一个角色有重复功能,有这种场景就给一个用户赋予多个角色

(3)数据抽象:通过权限的抽象来体现

RBAC权限模型分类

RBAC权限模型分类

RBAC0

在RBAC0中,一个用户可以具备多个角色,一个角色可以具备多个权限。如下图

RBAC1

RBAC1是在RBAC0的技术基础之上建立的,主要是增加了角色的继承关系,让角色有了上下级。如下图

RBAC2

RBAC2也是在RBAC0的技术基础之上建立的,引入了静态职责分离和动态职责分离。

角色互斥:在实际项目中有一些角色是互斥的,如财务就不能自己报账自己审批,对于这个角色一般不能和其他角色见人。通过职责分离可以解决这一问题。

静态职责分离:在权限配置阶段就做限制。如同一个用户不能被授予互斥的角色,授予时做互斥判断。

动态职责分离:运行阶段进行限制。如一个用户即使有多个角色,代码也会实时判断其真正有效的角色是几个。

RBAC3

RBAC3是RBAC1和RBAC2的合体,如下图:

image.png


相关文章
|
2月前
|
存储 安全 Java
Java泛型类型擦除以及类型擦除带来的问题
Java泛型在编译时会进行类型擦除,所有泛型信息被移除,替换为原始类型(如Object或限定类型)。这导致List<String>和List<Integer>在运行时等价于List,引发反射可插入不兼容类型等问题。同时,泛型不支持基本数据类型、静态上下文中使用受限,且instanceof无法用于泛型类型判断。编译器通过桥接方法等机制解决多态冲突,并在获取元素时自动插入类型转换,保证类型安全。
|
2月前
|
存储 缓存 安全
One Trick Per Day
本文详解Java开发中六大易被忽视的陷阱:Map初始化容量设置不当、线程池滥用导致OOM、Arrays.asList的不可变性、遍历Map性能优化、SimpleDateFormat线程安全问题及并发更新加锁策略。通过源码分析与实例演示,揭示问题根源并提供Guava等最佳实践方案,助力提升系统稳定性与性能。
|
2月前
|
Java 调度
ScheduledThreadPoolExecutor解析
ScheduledThreadPoolExecutor适用于延时或周期性任务调度,继承自ThreadPoolExecutor但功能更强大。它通过ScheduledFutureTask实现任务的周期执行,并利用DelayedWorkQueue实现延迟控制,结合siftUp/siftDown维护任务顺序,通过take方法阻塞等待到期任务,从而实现精准的定时调度功能。
ScheduledThreadPoolExecutor解析
|
2月前
|
NoSQL Linux Shell
MongoDB单机部署
本文介绍MongoDB在Windows和Linux系统中的安装、配置与启动方法,包括下载地址、版本选择、解压安装、命令行及配置文件启动方式,并说明如何通过Mongo Shell和Compass图形化工具连接数据库,同时涵盖Linux环境下的服务部署、防火墙设置与安全关闭操作。
MongoDB单机部署
|
2月前
|
监控 Java 测试技术
OOM排查之路:一次曲折的线上故障复盘
本文复盘了线上服务因Paimon与RocksDB集成引发的三次OOM故障。从线程激增到堆外内存泄漏,排查过程曲折复杂,最终定位到SDK中RocksDB通过JNI申请内存未释放的根本原因,并通过架构优化解决。分享了MAT、NMT、async-profiler等工具的实战经验,总结了一套系统性的内存问题排查思路,为类似技术栈提供借鉴。
|
2月前
|
XML Java 数据格式
无标题
`@Configuration` 注解用于标记配置类,相当于 XML 配置文件。其中 `@Bean` 注解的方法可定义托管给 Spring IoC 容器的 Bean。通过注解方式启动容器后,配置类及其中注册的组件均会被成功加载并管理。
|
2月前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示对象协作过程,强调交互时序,直观表达并发行为。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于系统动态建模。
|
2月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
数据架构核心产出是ER图,通过四色原型法进行领域建模:红色MI表时序事件,绿色PPT为业务实体,黄色Role示参与角色,蓝色DESC提供描述属性。以风控系统为例,从业务流程提炼MI,构建PPT实体,补充角色与描述,最终提取实体关系,形成ER图,指导数据模型设计。(239字)
|
2月前
|
运维 Kubernetes Java
物理部署图
物理部署图描述系统运行时的硬件配置与软件部署结构,展现节点、构件、物件及连接关系,常用于理解分布式系统。它从运维视角出发,揭示应用如何在硬件上部署运行,是开发与运维协同的重要工具。
|
2月前
|
Java 大数据
ArrayList扩容机制
本文深入分析了ArrayList的add及扩容机制。添加元素时,先调用ensureCapacityInternal()确保容量,首次添加时默认扩容至10;通过grow()方法实现容量1.5倍增长,利用位运算提升性能。同时辨析了length、length()和size()的用法区别。