DEV Community

Cover image for RBAC SQL table create
YYT-0901
YYT-0901

Posted on

RBAC SQL table create

the core is: UserRolePermission

表结构总览

sys_user          用户表
sys_role          角色表
sys_permission    权限表(菜单/按钮/接口)
sys_user_role     用户-角色关联表(多对多)
sys_role_permission  角色-权限关联表(多对多)
Enter fullscreen mode Exit fullscreen mode

1. sys_user

CREATE TABLE `sys_user` (
  `id` bigint NOT NULL COMMENT '用户ID',
  `username` varchar(50) NOT NULL COMMENT '登录账号',
  `password` varchar(100) NOT NULL COMMENT '密码(加密存储,如BCrypt)',
  `nickname` varchar(50) DEFAULT NULL COMMENT '昵称',
  `avatar` varchar(255) DEFAULT NULL COMMENT '头像',
  `phone` varchar(20) DEFAULT NULL COMMENT '手机号',
  `email` varchar(100) DEFAULT NULL COMMENT '邮箱',
  `gender` tinyint DEFAULT NULL COMMENT '性别(0:未知,1:男,2:女)',
  `status` tinyint DEFAULT '1' COMMENT '状态(1:正常,0:禁用)',
  `last_login_time` datetime DEFAULT NULL COMMENT '最后登录时间',
  `last_login_ip` varchar(50) DEFAULT NULL COMMENT '最后登录IP',
  `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  `update_at` datetime DEFAULT NULL COMMENT '更新时间',
  `deleted` tinyint DEFAULT '0' COMMENT '逻辑删除(0:未删除,1:已删除)',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_username` (`username`),
  KEY `idx_phone` (`phone`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户表';
Enter fullscreen mode Exit fullscreen mode

2. sys_role

CREATE TABLE `sys_role` (
  `id` bigint NOT NULL COMMENT '角色ID',
  `role_name` varchar(50) NOT NULL COMMENT '角色名称,如"管理员"',
  `role_code` varchar(50) NOT NULL COMMENT '角色编码,如ROLE_ADMIN,代码里用来判断权限',
  `description` varchar(255) DEFAULT NULL COMMENT '角色描述',
  `sort` int DEFAULT NULL COMMENT '排序',
  `status` tinyint DEFAULT '1' COMMENT '状态(1:启用,0:禁用)',
  `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  `update_at` datetime DEFAULT NULL COMMENT '更新时间',
  `deleted` tinyint DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_role_code` (`role_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表';
Enter fullscreen mode Exit fullscreen mode

3. sys_permission

CREATE TABLE `sys_permission` (
  `id` bigint NOT NULL COMMENT '权限ID',
  `parent_id` bigint DEFAULT '0' COMMENT '父级ID,顶级为0',
  `name` varchar(50) NOT NULL COMMENT '权限名称,如"食品管理"',
  `type` tinyint NOT NULL COMMENT '类型(1:目录,2:菜单,3:按钮/操作,4:接口)',
  `permission_code` varchar(100) DEFAULT NULL COMMENT '权限标识,如 food:add,用于代码里@PreAuthorize判断',
  `path` varchar(255) DEFAULT NULL COMMENT '前端路由路径',
  `component` varchar(255) DEFAULT NULL COMMENT '前端组件路径',
  `icon` varchar(100) DEFAULT NULL COMMENT '图标',
  `api_path` varchar(255) DEFAULT NULL COMMENT '接口路径,如 /food/add(type=4时使用)',
  `api_method` varchar(10) DEFAULT NULL COMMENT '请求方式 GET/POST/PUT/DELETE',
  `sort` int DEFAULT NULL COMMENT '排序',
  `status` tinyint DEFAULT '1' COMMENT '状态(1:启用,0:禁用)',
  `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  `update_at` datetime DEFAULT NULL COMMENT '更新时间',
  `deleted` tinyint DEFAULT '0' COMMENT '逻辑删除',
  PRIMARY KEY (`id`),
  KEY `idx_parent_id` (`parent_id`),
  KEY `idx_permission_code` (`permission_code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='权限表(菜单/按钮/接口)';
Enter fullscreen mode Exit fullscreen mode

4. sys_user_role

CREATE TABLE `sys_user_role` (
  `id` bigint NOT NULL,
  `user_id` bigint NOT NULL COMMENT '用户ID',
  `role_id` bigint NOT NULL COMMENT '角色ID',
  `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_user_role` (`user_id`,`role_id`),
  KEY `idx_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='用户-角色关联表';
Enter fullscreen mode Exit fullscreen mode

5. sys_role_permission

CREATE TABLE `sys_role_permission` (
  `id` bigint NOT NULL,
  `role_id` bigint NOT NULL COMMENT '角色ID',
  `permission_id` bigint NOT NULL COMMENT '权限ID',
  `create_at` datetime DEFAULT NULL COMMENT '创建时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_role_permission` (`role_id`,`permission_id`),
  KEY `idx_permission_id` (`permission_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色-权限关联表';
Enter fullscreen mode Exit fullscreen mode

关系链路用户 → 用户角色关联表 → 角色 → 角色权限关联表 → 权限

一个用户查权限的完整链路:

SELECT DISTINCT p.permission_code
FROM sys_user u
JOIN sys_user_role ur ON ur.user_id = u.id
JOIN sys_role r ON r.id = ur.role_id AND r.status = 1
JOIN sys_role_permission rp ON rp.role_id = r.id
JOIN sys_permission p ON p.id = rp.permission_id AND p.status = 1
WHERE u.id = ? AND u.status = 1;
Enter fullscreen mode Exit fullscreen mode

Top comments (0)