架构设计之RBAC基于角色的访问控制设计

概念

RBAC(Role-Based Access Control,基于角色的访问控制)是一种常见的权限管理模型,它通过定义角色来分配权限,然后将角色分配给用户。在Java中实现RBAC权限管理,你可以遵循以下步骤:

  1. 定义权限模型

    • 角色(Role):角色是一组权限的集合。
    • 权限(Permission):权限是访问控制的最小单元,如查看、编辑、删除等。
    • 用户(User):用户是权限系统的主体,可以拥有多个角色。
  2. 设计数据结构

    • 使用类或数据库表来表示角色、权限和用户。
    • 角色和权限之间通常是多对多关系,可以通过一个关联表来实现。
  3. 创建数据库表(详细表设计看附录):

    • users:存储用户信息。
    • roles:存储角色信息。
    • permissions:存储权限信息。
    • role_permissions:角色和权限的关联表。
    • user_roles:用户和角色的关联表。
  4. 实现业务逻辑

    • 用户管理:创建、更新、删除用户信息。
    • 角色管理:创建、更新、删除角色信息。
    • 权限管理:创建、更新、删除权限信息。
    • 角色分配:将角色分配给用户。
    • 权限分配:将权限分配给角色。
  5. 访问控制

    • 在系统中的每个访问点,检查当前用户是否拥有执行操作所需的权限。
    • 可以通过拦截器(Interceptor)或过滤器(Filter)来实现。
  6. 会话管理

    • 用户登录后,其角色和权限信息应该被加载到会话中,以便进行访问控制检查。
  7. 实现安全措施

    • 确保所有的数据传输都是加密的。
    • 防止SQL注入和其他安全漏洞。
  8. 单元测试

    • 对权限管理的各个部分进行单元测试,确保逻辑正确。
  9. 用户界面

    • 提供一个用户界面,让用户能够看到自己的权限,并进行一些基本的权限管理操作。
  10. 日志记录

    • 对关键操作进行日志记录,以便于问题追踪和系统监控。

示例1 定义角色和权限的类

以下是一个简单的Java代码示例,展示如何定义角色和权限的类:

import java.util.HashSet;
import java.util.Set;//https://zhengkai.blog.csdn.net/
public class User {private String id;private String username;private Set<Role> roles = new HashSet<>();// 省略构造函数、getter和setter
}public class Role {private String id;private String name;private Set<Permission> permissions = new HashSet<>();// 省略构造函数、getter和setter
}public class Permission {private String id;private String name;// 省略构造函数、getter和setter
}public class AccessControlService {public boolean hasPermission(User user, Permission permission) {for (Role role : user.getRoles()) {if (role.getPermissions().contains(permission)) {return true;}}return false;}
}

数据库设计

在设计RBAC(基于角色的访问控制)系统的数据库时,你需要创建几个关键的表来存储用户、角色、权限以及它们之间的关系。以下是一些基本的表和字段设计示例:

  1. Users(用户表)

    • user_id: 主键,唯一标识一个用户。
    • username: 用户名,唯一。
    • password: 密码(存储加密后的密码)。
    • email: 电子邮箱地址。
    • created_at: 账户创建时间。
    • 其他用户相关信息字段。
  2. Roles(角色表)

    • role_id: 主键,唯一标识一个角色。
    • role_name: 角色名称,如管理员、普通用户等。
    • description: 角色描述。
    • created_at: 角色创建时间。
  3. Permissions(权限表)

    • permission_id: 主键,唯一标识一个权限。
    • permission_name: 权限名称,如DELETE_USER、EDIT_POST等。
    • description: 权限描述。
    • created_at: 权限创建时间。
  4. UserRole(用户角色关联表)

    • user_id: 外键,关联到Users表。
    • role_id: 外键,关联到Roles表。
    • 这个表表示多对多关系,一个用户可以有多个角色,一个角色可以被多个用户拥有。
  5. RolePermission(角色权限关联表)

    • role_id: 外键,关联到Roles表。
    • permission_id: 外键,关联到Permissions表。
    • 这个表表示多对多关系,一个角色可以包含多个权限,一个权限可以被多个角色拥有。
CREATE TABLE Users (user_id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(255) UNIQUE NOT NULL,password VARCHAR(255) NOT NULL,email VARCHAR(255),created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE Roles (role_id INT AUTO_INCREMENT PRIMARY KEY,role_name VARCHAR(255) UNIQUE NOT NULL,description TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE Permissions (permission_id INT AUTO_INCREMENT PRIMARY KEY,permission_name VARCHAR(255) UNIQUE NOT NULL,description TEXT,created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);CREATE TABLE UserRole (user_id INT,role_id INT,PRIMARY KEY (user_id, role_id),FOREIGN KEY (user_id) REFERENCES Users(user_id),FOREIGN KEY (role_id) REFERENCES Roles(role_id)
);CREATE TABLE RolePermission (role_id INT,permission_id INT,PRIMARY KEY (role_id, permission_id),FOREIGN KEY (role_id) REFERENCES Roles(role_id),FOREIGN KEY (permission_id) REFERENCES Permissions(permission_id)
);

 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

盘点全球Top10大云计算平台最热门技能证书

小李哥花了一年半时间终于考下全球10大云的77张认证&#xff0c;今天盘点下各个云的热门证书&#xff0c;希望能帮到非CS专业转IT和刚刚入行云计算的小伙伴。 排名取自23年Yahoo云计算市场份额排名报告&#xff0c;我会从云平台、证书价格、证书热门程度做推荐。 1️⃣亚马逊云…

第二届Godot游戏开发大赛来啦!

第二届Godot游戏开发大赛来啦&#xff01; 我们的开发大赛正式定名为Godot Hub Festival 2024&#xff0c;以后将按照年份命名。 另外&#xff0c;本次比赛将和openKylin开源社区的SIG组们合作举办(因此也可以叫Godot openKylin开发大赛)。比赛定于2024年7月1日正式开始&#x…

ElementUI框架搭建及组件使用

前言: 当开始使用ElementUI框架来搭建网站或Web应用程序时&#xff0c;了解框架的基本结构和组件的使用是至关重要的。ElementUI是一个基于Vue.js的框架&#xff0c;提供了丰富的UI组件和工具&#xff0c;可以帮助开发人员快速构建现代化的用户界面。 在本文中&#xff0c;我…

FinalShell:功能强大的 SSH 工具软件,Mac 和 Win 系统的得力助手

在当今数字化的时代&#xff0c;SSH 工具软件成为了许多开发者、运维人员以及技术爱好者不可或缺的工具。而 FinalShell 作为一款出色的中文 SSH 工具软件&#xff0c;无论是在 Mac 系统还是 Windows 系统上&#xff0c;都展现出了卓越的性能和便捷的使用体验。 FinalShell 拥…

Jmeter,badboy学习

1、注意Jmeter与jdk之间的版本对应 2、Jmeter的作用&#xff1a; jmeter可以做接口测试和压力测试。其中接口测试的简单操作包括做http脚本&#xff08;发get/post请求、加cookie、加header、加权限认证、上传文件&#xff09;、做webservice脚本、参数化、断言、关联&#x…

岗位实习最终篇(汇总)——人力资源管理系统(包含DDL,DML,视图,简单/复杂查询,触发器语句和存储过程语句)

DDL CREATE TABLE users (user_id INT AUTO_INCREMENT PRIMARY KEY COMMENT 员工ID,username VARCHAR(50) NOT NULL UNIQUE COMMENT 用户名,password VARCHAR(255) NOT NULL COMMENT 密码,first_name VARCHAR(50) NOT NULL COMMENT 名,last_name VARCHAR(50) NOT NULL COMMENT…

LLM探索:环境搭建与模型本地部署

前言 最近一直在炼丹&#xff08;搞AIGC这块&#xff09;&#xff0c;突然发现业务代码都索然无味了… 上次发了篇AI画图的文章&#xff0c;ChatGPT虽然没法自己部署&#xff0c;但现在开源的LLM还是不少的&#xff0c;只要有一块差不多的显卡&#xff0c;要搞个LLM本地部署还…

音视频开发32 FFmpeg 编码- 视频编码 h264 参数相关

1. ffmpeg -h 这个命令总不会忘记&#xff0c;用这个先将ffmpeg所有的help信息都list出来 C:\Users\Administrator>ffmpeg -h ffmpeg version 6.0-full_build-www.gyan.dev Copyright (c) 2000-2023 the FFmpeg developersbuilt with gcc 12.2.0 (Rev10, Built by MSYS2 pro…

单点登录(cookie+Redis)

1、什么是单点登录&#xff1f; Single Sign On简称SSo&#xff0c;只需要登录一次就可以在整个系统实现访问。 因为session的特性&#xff0c;是没有办法在多个服务系统之间实现数据的共享。 解决一个分布式session的问题。目前我们使用redis来实现分布式session。 1.1、新问题…

2000-2021年县域金融机构存贷款数据

2000-2021年县域金融机构存贷款数据 1、时间&#xff1a;2000-2021年 2、指标&#xff1a;统计年度、地区编码ID、县域代码、县域名称、所属地级市、所属省份、年末金融机构贷款余额/亿元、年末金融机构存款余额/亿元、年末城乡居民储蓄存款余额/亿元 3、来源&#xff1a;县…

[OtterCTF 2018]Graphic‘s For The Weak

恶意软件的图形中有些可疑之处。 软件图形 &#xff1f;&#xff1f;&#xff1f;这里的恶意文件都是 vmware-tray.ex使用procdump转存进程的可执行文件 &#xff08;可执行的&#xff09;导出了 &#xff0c;看文件里面是否存在 图片 volatility.exe -f .\OtterCTF.vmem --pro…

3.3V到5V的负电源产生电路(电荷泵电压反相器)SGM3204输出电流0.2A封装SOT23-6

前言 SGM3204 非稳压 200mA 电荷泵负电源产生电路&#xff0c;LCEDA原理图请访问资源 SGM3204电荷泵负电源产生电路 SGM3204电荷泵负电源产生电路 一般描述 SGM3204从 1.4V 至 5.5V 的输入电压范围产生非稳压负输出电压。 该器件通常由 5V 或 3.3V 的预稳压电源轨供电。由于…

网盘挂载系统-知识资源系统-私域内容展示系统

系统介绍&#xff1a; 存储&#xff1a;一共支持约30款云盘存储&#xff0c;其中包括主流的&#xff08;百度网盘、阿里云盘、夸克云盘、迅雷云盘、蓝奏云、天翼云盘&#xff09;&#xff0c;部分展示 以及特别的&#xff08;一刻相册、对象存储、又拍云存储、SFTP、MEGA 网盘…

【Linux】解锁并发:多线程同步技术详解与应用实践

文章目录 前言&#xff1a;1. 同步概念2. 条件变量&#xff1a;实现线程间同步的&#xff01;2.1. 条件变量是什么&#xff1f;2.2. 认识条件变量接口 3. 写一个测试代码——验证线程的同步机制4. 生产消费模型5. 生产消费模型 条件变量6. 线程池7. 可重入 VS 线程安全7.1. 概…

leetcode-20-回溯-切割、子集

一、[131]分割回文串 给定一个字符串 s&#xff0c;将 s 分割成一些子串&#xff0c;使每个子串都是回文串。 返回 s 所有可能的分割方案。 示例: 输入: "aab" 输出: [ ["aa","b"], ["a","a","b"] ] 分析&…

运维锅总详解Nginx

本文尝试从Nginx特性及优缺点、为什么具有文中所述的优缺点、Nginx工作流程、Nginx最佳实践及历史演进等角度对其进行详细分析。希望对您有所帮助。 Nginx特性及优缺点 Nginx简介 Nginx&#xff08;发音为 “engine-x”&#xff09;是一款高性能的开源Web服务器及反向代理服…

前后端分离的后台管理系统开发模板(带你从零开发一套自己的若依框架)上

前言&#xff1a; 目前&#xff0c;前后端分离开发已经成为当前web开发的主流。目前最流行的技术选型是前端vue3后端的spring boot3&#xff0c;本次。就基于这两个市面上主流的框架来开发出一套基本的后台管理系统的模板&#xff0c;以便于我们今后的开发。 前端使用vue3ele…

狼人杀系列

目录 杀人游戏&#xff08;天黑请闭眼&#xff09; &#xff08;1&#xff09;入门版 &#xff08;2&#xff09;标准版 &#xff08;3&#xff09;延伸版——百度百科 &#xff08;3.1&#xff09;引入医生和秘密警察 &#xff08;3.2&#xff09;引入狙击手、森林老人和…

Python WebSocket自动化测试:构建高效接口测试框架

为了更高效地进行WebSocket接口的自动化测试&#xff0c;我们可以搭建一个专门的测试框架。本文将介绍如何使用Python构建一个高效的WebSocket接口测试框架&#xff0c;并重点关注以下四个方面的内容&#xff1a;运行测试文件封装、报告和日志的封装、数据驱动测试以及测试用例…

50-2 内网信息收集 - 内网工作环境(域相关知识)

一、工作组 工作组(Work Group)是局域网中最基本的资源管理模式,适用于小规模网络环境。 工作组的定义: 工作组是将不同功能或部门的计算机分组管理的方式。它提供了层次化的网络资源管理,使得组织内的计算机可以按照功能或部门分类。每个工作组有一个自定义的主机名称,…