RBAC——基于角色的访问控制

目录

一、RBAC核心概念

1. 角色(Role)

2. 用户(User)

3. 权限(Permission)

4. 会话(Session)

二、RBAC模型的演进 

1. RBAC0:基本模型

2. RBAC1:角色层次模型

3. RBAC2:约束模型

三、RBAC权限设计的一般步骤

四、RBAC在Java项目中的实现实例

1.设置数据库表结构

2.配置Spring Security

3.实现UserDetailsService

五、RBAC的优缺点

1. 优点

2. 缺点


      

        在现代信息系统中,随着功能的扩展和用户数量的增加,权限管理变得越来越复杂。传统的基于用户的权限管理方式难以应对大规模系统的需求,因此引入了基于角色的访问控制(Role-Based Access Control,RBAC)模型。RBAC通过角色来分配权限,简化了权限管理复杂度,提升了系统的安全性。

一、RBAC核心概念

1. 角色(Role)

        角色是一组权限的集合,代表在组织内执行特定任务或职责的用户群体。例如,“管理员”、“编辑”和“访客”等。角色可以看作是用户组的抽象,通过角色可以将复杂的权限管理变得简单和有序。

2. 用户(User)

        用户是指系统中的实际使用者,每个用户被分配到一个或多个角色,从而获得相应的权限。用户与角色之间是多对多的关系,一个用户可以拥有多个角色,一个角色也可以分配给多个用户。

3. 权限(Permission)

        权限指用户可以对系统资源进行的操作,如“读取”、“写入”或“删除”。权限定义了系统资源的访问规则,决定了用户能够执行的具体操作内容。

4. 会话(Session)

        会话是用户通过身份验证后建立的与系统之间的连接。会话期间,用户的角色和权限将被激活,确保用户只能访问其被授予的资源。会话通常包括用户的登录状态、角色以及临时权限等信息。

二、RBAC模型的演进 

1. RBAC0:基本模型

RBAC0是最原始且最简单的RBAC模型,主要包括以下几个部分:

  • 用户(Users):系统的使用者。
  • 角色(Roles):一组权限的集合。
  • 权限(Permissions):系统资源的访问许可。
  • 用户-角色映射(User-Role Assignment):用户与角色之间的关联。
  • 角色-权限映射(Role-Permission Assignment):角色与权限之间的关联。

RBAC0模型没有角色层次结构和约束限制,适用于小型系统或对权限管理要求不高的场景。

2. RBAC1:角色层次模型

RBAC1在RBAC0的基础上增加了角色层次结构,即角色之间有上下级之分。这种层次关系可以是一般继承关系或受限继承关系。

  • 一般继承关系:允许角色间的多继承,即一个角色可以继承多个父角色的权限。
  • 受限继承关系:角色间的继承关系是一个树形结构,避免多继承带来的复杂性。

RBAC1适用于角色层次分明、需要明确角色间权限传递关系的系统。

3. RBAC2:约束模型

RBAC2在RBAC1的基础上增加了约束条件,用于限制角色的权限分配。常见的约束包括:

  • 互斥角色:同一用户不能同时拥有两个互斥的角色。例如,审计员和管理员不能为同一人。
  • 基数约束:限定角色分配的用户数量或用户拥有的角色数量。例如,一个角色最多只能分配给一定数量的用户。
  • 先决条件:某些角色只有在用户至少拥有一个其他角色的情况下才能被分配。例如,只有当前角色是副经理时,才能成为经理。

RBAC2模型通过增加约束条件,进一步提高了权限管理的灵活性和安全性。

        总的来说,RBAC模型经历了多次改进,主要包括RBAC0、RBAC1、RBAC2和RBAC3。RBAC0是基础模型,定义了基本要素。RBAC1引入了角色层次和继承。RBAC2增加了约束和限制,如互斥角色和基数约束。RBAC3则结合了RBAC1和RBAC2,进一步完善了模型。

三、RBAC权限设计的一般步骤

        RBAC权限设计的一般步骤包括需求分析、角色定义、权限分配和验证机制等。下面将详细阐述这些步骤:

  1. 需求分析

    • 确定系统需求:明确系统需要实现的功能和业务流程,识别出系统中的关键资源和操作。
    • 识别用户角色:根据业务需求,确定系统中的用户角色及其职责,例如管理员、普通用户、访客等。
    • 分析权限需求:为每个角色确定所需的权限,确保最小权限原则,即只授予完成工作所必需的权限。
  2. 角色定义

    • 创建角色:根据需求分析的结果,创建不同的角色,并定义每个角色的职责范围。
    • 角色层次结构:设计角色的层次结构,如上级角色继承下级角色的权限,以简化管理。
    • 角色属性:为每个角色定义属性,如角色名称、描述、权限集合等。
  3. 权限分配

    • 定义权限:明确系统中的权限类型,如读、写、删除等操作,并将这些权限细化到具体资源。
    • 关联角色与权限:通过数据库表或配置文件,将权限分配给相应的角色。
    • 用户角色分配:将用户分配到一个或多个角色,使用户获得相应角色的所有权限。
  4. 验证机制

    • 会话管理:在用户登录时,建立会话并分配相应的角色和权限,确保在会话期间权限的有效性。
    • 权限验证:在用户执行操作时,检查其角色是否拥有相应的权限,确保操作的合法性。
    • 审计监控:记录用户的活动和权限变更情况,以便进行安全审计和问题排查。

总之,通过合理设计和实施RBAC权限系统,可以有效简化权限管理,提高系统的安全性和管理效率。

四、RBAC在Java项目中的实现实例

1.设置数据库表结构

通常需要设计用户表、角色表、权限表和用户角色关联表等

CREATE TABLE users (
    user_id BIGINT PRIMARY KEY,
    username VARCHAR(50) NOT NULL
);

CREATE TABLE roles (
    role_id BIGINT PRIMARY KEY,
    role_name VARCHAR(50) NOT NULL
);

CREATE TABLE permissions (
    permission_id BIGINT PRIMARY KEY,
    permission_name VARCHAR(50) NOT NULL
);

CREATE TABLE role_permissions (
    role_id BIGINT,
    permission_id BIGINT,
    PRIMARY KEY (role_id, permission_id),
    FOREIGN KEY (role_id) REFERENCES roles(role_id),
    FOREIGN KEY (permission_id) REFERENCES permissions(permission_id)
);

CREATE TABLE user_roles (
    user_id BIGINT,
    role_id BIGINT,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(user_id),
    FOREIGN KEY (role_id) REFERENCES roles(role_id)
);

2.配置Spring Security

        Spring Security提供了对RBAC的良好支持,我们可以通过配置类来实现。

@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/seller/**").hasAnyRole("ADMIN", "SELLER")
                .antMatchers("/buyer/**").hasAnyRole("ADMIN", "SELLER", "BUYER")
                .anyRequest().authenticated()
            .and()
            .formLogin();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(userDetailsService).passwordEncoder(new BCryptPasswordEncoder());
    }
}

3.实现UserDetailsService

        我们需要从数据库中获取用户信息并加载其角色和权限。

@Service
public class CustomUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), getAuthorities(user));
    }

    private Collection<? extends GrantedAuthority> getAuthorities(User user) {
        List<GrantedAuthority> authorities = new ArrayList<>();
        for (Role role : user.getRoles()) {
            authorities.add(new SimpleGrantedAuthority(role.getName()));
        }
        return authorities;
    }
}

五、RBAC的优缺点

1. 优点

  • 简化权限管理:通过角色分配权限,管理员无需逐一为用户配置权限,降低了管理复杂度。
  • 提高系统安全性:实施最小权限原则,只授予用户完成任务所需的最小权限,减少安全风险。
  • 支持灵活扩展:随着组织的发展和变化,可以轻松添加新的角色和权限,满足不断变化的需求。
  • 合规性支持:RBAC有助于满足各种法规和合规性要求,如GDPR、HIPAA等。

2. 缺点

  • 无法控制操作顺序:RBAC模型缺乏对操作顺序的控制机制,难以适应对操作次序有严格要求的系统。
  • 角色维护成本高:在复杂的业务场景中,角色的管理和维护可能变得复杂和困难。
  • 可能存在权限冗余:在某些情况下,过多的角色和权限可能导致冗余,增加管理难度。

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

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

相关文章

OceanBase V4.x应用实践:如何排查表被锁问题

DBA在日常工作中常常会面临以下两种常见情况&#xff1a; 业务人员会提出问题&#xff1a;“表被锁了&#xff0c;导致业务受阻&#xff0c;请帮忙解决。” 业务人员还会反馈&#xff1a;“某个程序通常几秒内就能执行完毕&#xff0c;但现在却运行了好几分钟&#xff0c;不清楚…

同三维T80003JEHS 4K/60帧HDMI/SDI超高清H.265解码器

1路HDMI和1路SDI输出&#xff0c;1路3.5音频输入和1路3.5音频输出&#xff0c;1个USB2.0口1个USB3.0口&#xff0c;带1个RS232串口&#xff0c;2个网口&#xff0c;支持1路4K60或4路4K30或16路1080P或32路720P解码输出。4种画面分割显示模式。 产品简介&#xff1a; 同三维T80…

【更新中】《硬件架构的艺术》笔记(五):低功耗设计

介绍 能量以热量形式消耗&#xff0c;温度升高芯片失效率也会增加&#xff0c;增加散热片或风扇会增加整体重量和成本&#xff0c;在SoC级别对功耗进行控制就可以减少甚至可能消除掉这些开支&#xff0c;产品也更小更便宜更可靠。本章描述了减少动态功耗和静态功耗的各种技术。…

网络安全审计概述与分类

目录 网络安全审计概述等保五个级别对审计要求网络安全审计系统组成网络安全审计系统类型 网络安全审计概述 4A分别是认证、授权、账号、审计 网络安全审计是指对网络信息系统的安全相关活动信息进行获取、记录、存储分析和利用的工作。 网络安全审计的作用在于建立“事后”…

安宝特方案 | AR助力紧急救援,科技守卫生命每一刻!

在生死时速的紧急救援战场上&#xff0c;每一秒都至关重要&#xff01;随着科技的发展&#xff0c;增强现实&#xff08;AR&#xff09;技术正在逐步渗透到医疗健康领域&#xff0c;改变着传统的医疗服务模式。 安宝特AR远程协助解决方案&#xff0c;凭借其先进的技术支持和创新…

IDEA:2023版远程服务器debug

很简单&#xff0c;但是很多文档没有写清楚&#xff0c;wocao 一、首先新建一个远程jvm 二、配置 三、把上面的参数复制出来 -agentlib:jdwptransportdt_socket,servery,suspendn,address5005 四、然后把这串代码放到服务器中&#xff08;这里的0.0.0.0意思是所有IP都能访问&a…

Midjourney基础命令和提示词

1 基础命令 1.1 /imagine prompt 生成图片的核心命令&#xff0c;prompt 后输入描述。 /imagine prompt: A majestic dragon flying over a misty mountain, cinematic lighting, 4K resolution 高级提示 1.1.1 基本参数 图片比例 --ar 图片比例 混乱 Aspect Ratios --…

ElasticSearch7.x入门教程之索引概念和基础操作(三)

文章目录 前言一、索引基本概念二、索引基本使用elasticsearch-head插件Kibana使用 总结 前言 要想熟悉使用ES的索引&#xff0c;则必须理解索引相关的概念&#xff0c;尤其是在工作当中。 在此记录&#xff0c;方便开展工作。 一、索引基本概念 尽量以通俗的话语。 1、集群…

【SQL50】day 2

目录 1.每位经理的下属员工数量 2.员工的直属部门 3.判断三角形 4.上级经理已离职的公司员工 5.换座位 6.电影评分 7.修复表中的名字 8.患某种疾病的患者 9.删除重复的电子邮箱 1.每位经理的下属员工数量 # Write your MySQL query statement below #e1是经理&#xff0c;…

基于 RocketMQ 实现 AMQP 协议实践

导语 在Apache CoC 2024 杭州站大会中&#xff0c;腾讯云高级工程师张乐为与会者带来了精彩的演讲。围绕《基于 RocketMQ 底座实现 AMQP 协议》的背景、目标、方案设计以及几个核心技术实现做了详细的阐述。 作者简介 张乐 腾讯高级工程师&#xff0c;负责腾讯云 RabbitMQ S…

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析

目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …

我做了一份斯坦福CS229吴恩达机器学习笔记

吴恩达教授的机器学习课程&#xff0c;可以说是AI领域的一块金字招牌。这门在斯坦福大学开设的课程&#xff0c;历经十余年&#xff0c;依旧是机器学习入门的经典之作。 记得当年&#xff0c;这门课火爆到吴恩达教授不得不将其搬到线上&#xff0c;结果不仅在斯坦福&#xff0c…

ABAP开发学习——SNRO

SAP凭证号码的指定分为外部给号和内部给号。 Internal number range即内部给号,指系统根据预先维护好的号码范围&#xff08;只能是阿拉伯数字&#xff09;依序给号,给出已有数字的下一个编号。 External number range即外部给号,后台配置时指指定一个号码范围&#xff08;可以…

SpringBoot3整合Hutool-captcha实现图形验证码

文章目录 验证码需求分析:项目创建import方式的使用说明exclude方式定义接口:接口定义定义 CaptchaController前端代码在整合技术框架的时候,想找一个图形验证码相关的框架,看到很多验证码不在更新了或者是在中央仓库下载不下来,还需要多引入依赖。后面看到了Hutool **图形…

mysql-connector-java的jar包的下载方法汇总

方法一&#xff1a; 网址&#xff1a;http://mvnrepository.com/artifact/mysql/mysql-connector-java 1.进去后选择自己的版本&#xff1a; 2.然后再点击 3. 需要下载其他的jar包&#xff08;或者依赖&#xff09;都是在此网址中可以下载到的 3.1 3.2 3.3 3.4 方法二&#…

Spring Cloud Stream实现数据流处理

1.什么是Spring Cloud Stream&#xff1f; 我看很多回答都是“为了屏蔽消息队列的差异&#xff0c;使我们在使用消息队列的时候能够用统一的一套API&#xff0c;无需关心具体的消息队列实现”。 这样理解是有些不全面的&#xff0c;Spring Cloud Stream的核心是Stream&#xf…

i春秋-签到题

练习平台地址 竞赛中心 题目描述 题目内容 点击GUESS后会有辨识细菌的选择题 全部完成后会有弹窗提示 输入nickname后提示获得flag F12检查 元素中没有发现信息 检查后发现flag在控制台中 flag flag{663a5c95-3050-4c3a-bb6e-bc4f2fb6c32e} 注意事项 flag不一定要在元素中找&a…

无人机 PX4飞控 | CUAV 7-Nano 飞行控制器介绍与使用

无人机 PX4飞控 | CUAV 7-Nano 飞行控制器介绍与使用 7-Nano简介硬件参数接口定义模块连接供电部分遥控器电机 固件安装 7-Nano简介 7-Nano是一款针对小型化无人系统设备研发的微型自动驾驶仪。它由雷迅创新自主研发和生产&#xff0c;其创新性的采用叠层设计&#xff0c;在极…

怎么编译OpenWrt镜像?-基于Widora开发板

1.准备相应的环境&#xff0c;我使用的环境是VMware16ubuntu20.04&#xff0c;如图1所示安装编译所需的依赖包&#xff1b; sudo apt-get install build-essential asciidoc binutils bzip2 gawk gettext git libncurses5-dev libz-dev patch python3 python2.7 unzip zlib1g-…

优化表单交互:在 el-select 组件中嵌入表格显示选项

介绍了一种通过 el-select 插槽实现表格样式数据展示的方案&#xff0c;可更直观地辅助用户选择。支持列配置、行数据绑定及自定义搜索&#xff0c;简洁高效&#xff0c;适用于复杂选择场景。完整代码见GitHub 仓库。 背景 在进行业务开发选择订单时&#xff0c;如果单纯的根…