当前位置: 首页 > news >正文

基于RABC的权限控制设计

知道权限设计容易,但是要有较好的扩展性需要费一番功夫的。提出现实问题:

  1. 一个部门有100人,需要给100人以相同的角色
  2. 经理单独给某个员工增加一个权限,但整个部门权限其他人不变
  3. 两个按钮可能调用相同的URL,怎么进行控制
  4. 资源对象需要根据开发线上环境进行分组
  5. 研发可以操作研发组的机器,运维可以操作线上组机器
  6. 给某个研发临时加一个机器权限,用于核查问题,其他人权限不变

最终模型为

特殊点:

1. 用户和角色直接关联,用户的角色来自于:用户组+直接的角色赋予

2. 角色管理的机器同样来自资源组+直接管理的机器

3. 按钮和URL没有对应关系,可以相互交换

设计sql脚本(mysql版本)

-- 创建用户表 CREATE TABLE IF NOT EXISTS sys_user ( `id` bigint(20) NOT NULL COMMENT '主键ID', `user_login_name` VARCHAR(50) COMMENT '用户登录姓名不可以重复', `user_real_name` VARCHAR(50) COMMENT '用户正式姓名', `password` VARCHAR(100), `phone` VARCHAR(20) COMMENT '手机号码', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建用户组 CREATE TABLE IF NOT EXISTS sys_group ( `id` bigint(20) NOT NULL COMMENT '主键ID', `group_name` VARCHAR(50) COMMENT '群组名称', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建角色表 CREATE TABLE IF NOT EXISTS sys_role ( `id` bigint(20) NOT NULL COMMENT '主键ID', `role_name` VARCHAR(50) NOT NULL COMMENT '角色名称', `role_type` VARCHAR(20) NOT NULL DEFAULT '1' COMMENT '角色类型,系统内置角色不展示,0为系统内置角色,1为自定义角色', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建权限表 CREATE TABLE IF NOT EXISTS sys_permission ( `id` bigint(20) NOT NULL COMMENT '主键ID', `permission_key` VARCHAR(50) NOT NULL COMMENT '角色KEY', `permission_type` VARCHAR(20) NOT NULL COMMENT '权限类型,取值:enum菜单 button按钮 url就是URL', `tenant_id` bigint(20) NOT NULL DEFAULT 0 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建用户和用户组关系表 CREATE TABLE IF NOT EXISTS sys_user_group ( `id` bigint(20) NOT NULL COMMENT '主键ID', `user_id` bigint(20) NOT NULL COMMENT '用户ID', `user_real_name` VARCHAR(50) COMMENT '用户正式姓名', `group_id` bigint(20) NOT NULL COMMENT '用户组ID', `group_name` VARCHAR(50) COMMENT '群组名称', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建用户和角色的关系 CREATE TABLE IF NOT EXISTS sys_user_role ( `id` bigint(20) NOT NULL COMMENT '主键ID', `user_id` bigint(20) NOT NULL COMMENT '用户ID', `user_real_name` VARCHAR(50) COMMENT '用户正式姓名', `role_id` bigint(20) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(50) COMMENT '角色名称', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建用户组和角色的关系 CREATE TABLE IF NOT EXISTS sys_group_role ( `id` bigint(20) NOT NULL COMMENT '主键ID', `group_id` bigint(20) NOT NULL COMMENT '用户组ID', `group_name` VARCHAR(50) COMMENT '群组名称', `role_id` bigint(20) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(50) COMMENT '角色名称', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建用户组和角色的关系 CREATE TABLE IF NOT EXISTS sys_role_permission ( `id` bigint(20) NOT NULL COMMENT '主键ID', `role_id` bigint(20) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(50) COMMENT '角色名称', `permission_key` bigint(20) NOT NULL COMMENT '权限ID', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建Linux资源表 CREATE TABLE IF NOT EXISTS linux_resource ( `id` bigint(20) NOT NULL COMMENT '主键ID', `resource_name` VARCHAR(255) COMMENT '资源名称', `ip_address` VARCHAR(50), `username` VARCHAR(255), `password` VARCHAR(255), `description` TEXT COMMENT '描述信息', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建资源组表 CREATE TABLE IF NOT EXISTS resource_group ( `id` bigint(20) NOT NULL COMMENT '主键ID', `resource_group_name` VARCHAR(255) NOT NULL COMMENT '资源组名称', `description` TEXT COMMENT '描述信息', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建角色和资源的关系 CREATE TABLE IF NOT EXISTS sys_role_resource ( `id` bigint(20) NOT NULL COMMENT '主键ID', `role_id` bigint(20) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(50) COMMENT '角色名称', `resource_id` bigint(20) NOT NULL COMMENT '资源ID', `resource_name` VARCHAR(255) COMMENT '资源名称', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE ); -- 创建角色和资源的关系 CREATE TABLE IF NOT EXISTS sys_role_resource_group ( `id` bigint(20) NOT NULL COMMENT '主键ID', `role_id` bigint(20) NOT NULL COMMENT '角色ID', `role_name` VARCHAR(50) COMMENT '角色名称', `resource_group_id` bigint(20) NOT NULL COMMENT '资源ID', `resource_group_name` VARCHAR(255) COMMENT '资源名称', `tenant_id` bigint(20) NOT NULL DEFAULT 10000 COMMENT '租户ID,1000为演示租户,0为内置数据', `create_by` varchar(255) DEFAULT NULL COMMENT '创建人', `create_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) COMMENT '创建时间', `update_by` varchar(255) DEFAULT NULL COMMENT '更新人', `update_time` timestamp(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '更新时间', `remark` varchar(255) DEFAULT NULL COMMENT '备注', `is_deleted` tinyint(1) DEFAULT '0' COMMENT '是否删除,0为否,1为是', PRIMARY KEY (`id`) USING BTREE );

Sql设计点

保留关联表中增加角色名称,用户名称等所有冗余名称(运维查表一目了然)

✅ 表ID无自增主键(全部雪花 ID)迁移数据超级方便,也可以进行hash分表

无唯一索引(无 DB 强校验,业务层控制,为多租户做准备,不影响insert性能)

支持 用户 - 用户组 - 角色 - 权限 - 资源完整模型

支持单独给某一个人加特殊权限(现实中的痛点)

✅ 支持逻辑删除,而非硬删除

吐槽AI Coding(TraeCN)

这些设计点AI就搞不出来,还需要自己调整。但用这个sql生成Mapper和Service是相当容易的。这就让VibeCoding 做企业级的软件不合适,辅助开发还是可以提升效率的。

http://www.jsqmd.com/news/512063/

相关文章:

  • 数据库设计原则
  • Qwen2.5-VL-7B-Instruct保姆级教程:对话历史管理、一键清空操作
  • 总结上海移民中介服务费用情况,多少钱才合理 - mypinpai
  • WangEditor — 轻量级富文本编辑器的核心功能与实战应用
  • 【技术干货】MiniMax M2.7 自主进化多智能体模型:从原理到实战落地指南
  • Pixel Dimension Fissioner部署教程:GPU算力优化适配+免配置镜像实操
  • RADIUS协议实战解析:从RFC2865/2866到典型配置与报文深度剖析
  • Pixel Dimension Fissioner快速上手:像素UI交互+实时HUD状态监控详解
  • 如何用AI读脸术做实时分析?CPU推理优化实战案例详解
  • SEO_如何通过内容优化有效提升SEO效果?(143 )
  • 2026年怀化透析中心排名,附近透析中心收费标准与服务质量对比 - myqiye
  • Qwen-Image镜像一键部署:预装CUDA12.4+PyTorch+Qwen-VL依赖的极简方案
  • AudioLDM-S生成效果实测对比:10步和50步有什么区别?听音频就知道
  • 2026年市场上有实力的磁性材料成型液压机源头厂家推荐榜单,稀土永磁压制/铁氧体成型/磁性材料湿法成型/自动化生产线,磁性材料成型液压机制造企业哪家好 - 品牌推广师
  • Kubernetes存储与GPU管理:从开源到主流云厂商的最佳实践
  • Jimeng AI Studio(Z-Image Edition)入门教程:环境部署与快速调用指南
  • 测貂图片AI工具时,模板多不等于后面好改
  • 2026年浙江地区好用的弯管机厂家推荐,专业厂商盘点 - 工业推荐榜
  • 【工业级C语言OTA健壮性设计】:基于CRC32+SHA256+版本指纹三重校验的失败分级响应策略
  • Python实战:利用莱斯利模型预测种群动态变化
  • # 发散创新:用Python打造自动化渗透测试工具链——从扫描到漏洞利用全流程实战在现代信息安全
  • LVGL 7.10.1在STM32F103上的嵌入式GUI移植实战
  • Qwen3-32B-Chat开源模型部署新范式:单卡24G实现32B参数高效推理
  • 总结哈尔滨自动变速箱维修推荐,怎么选择合适的公司? - 工业设备
  • FFmpeg编解码实战
  • SEO_10个提升网站排名的实用SEO技巧分享(470 )
  • STM32 进阶封神之路(十九):ADC 深度解析 —— 从模拟信号到数字转换(底层原理 + 寄存器配置)
  • 告别竞态条件:call_once 原理与应用,如何优雅地解决并发初始化难题
  • 召回率优化进入倒计时:Dify即将弃用legacy-rag插件接口,立即下载迁移工具包+自动适配脚本(含召回A/B测试看板)
  • 2026年广东门窗行业新风向,分析广东十大品牌市场份额如何及价格 - 工业品牌热点