基于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 做企业级的软件不合适,辅助开发还是可以提升效率的。

相关推荐
敲代码的瓦龙21 分钟前
Jetpack?lifecycle!!!
android·kotlin
苦瓜花27 分钟前
Hilt用使用及原理
android
深度学习04072 小时前
MySQL InnoDB Cluster 部署完整文档
android·mysql·adb
邪修king2 小时前
Re:Linux系统篇(三十七):进程间通信Chapter4:System V 共享内存深度解析:为什么它是最快的 IPC?
android·linux·运维
用户337922545683 小时前
Kiora SDK:在 Android 上组织端侧模型、工具与 A2A 协作
android
洞见前行3 小时前
你在 XML 时代学的渲染优化,进了 Compose 大多不再是重点——Recomposition 才是新的战场
android
ii_best3 小时前
按键精灵手机助手 v5.2.1 实测:inputText 逐字延时 + 调试面板多行复制,安卓脚本开发的两个输入痛点一次解决
android·开发语言·智能手机·自动化·ai编程·按键精灵
hunterandroid3 小时前
OkHttp 源码解析:拦截器链、连接池与缓存策略的设计精髓
android
蒲公英内测分发3 小时前
智能手环出海测试,海外合作方分散在不同国家,Android 测试包怎么持续分发和更新?
android·前端·人工智能·测试工具·智能手表
朱涛的自习室4 小时前
高价软件已死,我让 AI 开启了「平替计划」(Day 7 / 7)
android·前端·github