跳到主要内容

Nebula Auth 建表与迁移说明

1. SQL 文件位置

当前 nebula-auth 已提供 2 份与数据库相关的 SQL 文件,均位于:

  • nebula-auth/nebula-auth-core/src/main/resources/db/schema/

具体包括:

  1. 01-auth-schema-mysql.sql:auth 模块初始化建表脚本
  2. 02-auth-org-type-migration-mysql.sql:组织类型字段迁移脚本

从文件头部说明可确认:

  • 目标数据库:MySQL 8
  • 默认字符集:utf8mb4
  • 排序规则:utf8mb4_unicode_ci
  • 主键采用 32 位 UUID v7 字符串

2. 初始化脚本

初始化脚本会先执行:

SET NAMES utf8mb4;
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS = 0;

最后再恢复:

SET FOREIGN_KEY_CHECKS = 1;

这样做的目的是:

  • 保证建表阶段统一使用 UTF-8 编码
  • 让脚本在容器化或不同环境中执行时更稳定
  • 降低建表顺序受外键检查影响的风险

3. 表结构说明

3.1 用户表 auth_user

作用:

  • 存储平台基础用户信息
  • 支撑登录、当前用户信息与用户管理

核心字段:

字段说明
id主键,UUID v7
username用户名,唯一
password密码
nickname昵称
avatar头像 URL
email邮箱
phone手机号
status状态:0 禁用,1 启用
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_user_username(username)
  • 索引:idx_user_status(status)

3.2 角色表 auth_role

作用:

  • 存储后台角色定义
  • 作为权限聚合主体之一

核心字段:

字段说明
id主键
code角色编码,唯一
name角色名称
description角色描述
status状态
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_role_code(code)
  • 索引:idx_role_status(status)

3.3 组织表 auth_org

作用:

  • 存储组织结构
  • 支撑组织树、组织授权与用户组织归属

核心字段:

字段说明
id主键
name组织名称
parent_id父组织 ID
path层级路径
sort排序
code组织编码,唯一
type类型:COMPANY / DEPARTMENT / TEAM
status状态
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_org_code(code)
  • 索引:idx_org_status(status)
  • 索引:idx_org_parent_id(parent_id)

3.4 用户组织关联表 auth_user_org

作用:

  • 建立用户与组织之间的多对多关系
  • 标识用户主组织

核心字段:

字段说明
id主键
user_id用户 ID
org_id组织 ID
primary_flag是否主组织:0 否,1
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_user_org(user_id, org_id)
  • 索引:idx_user_org_user_id(user_id)
  • 索引:idx_user_org_org_id(org_id)

3.5 用户角色关联表 auth_user_role

作用:

  • 建立用户与角色之间的多对多关系

核心字段:

字段说明
id主键
user_id用户 ID
role_id角色 ID
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_user_role(user_id, role_id)
  • 索引:idx_user_role_user_id(user_id)
  • 索引:idx_user_role_role_id(role_id)

3.6 菜单表 auth_menu

作用:

  • 存储后台菜单与路由元数据
  • 为菜单树渲染与菜单授权提供数据支撑

核心字段:

字段说明
id主键
name菜单名称
parent_id父菜单 ID
path路由路径
sort排序号
code菜单编码,唯一
icon图标
component前端组件路径
type类型
status状态
hidden是否隐藏
external_flag是否外链
external_url外链地址
visible_in_breadcrumb是否显示在面包屑
visible_in_tab是否显示在标签页
active_menu_path激活菜单路径
remark备注

关键约束:

  • 唯一键:uk_menu_code(code)
  • 索引:idx_menu_status(status)
  • 索引:idx_menu_parent_id(parent_id)

3.7 按钮表 auth_button

作用:

  • 存储页面按钮资源
  • 用于动作级权限控制

核心字段:

字段说明
id主键
menu_id所属菜单 ID
code按钮编码,唯一
name按钮名称
type按钮类型,如 add / edit / delete / export
sort排序号
status状态
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_button_code(code)
  • 索引:idx_button_status(status)
  • 索引:idx_button_menu_id(menu_id)

3.8 权限表 auth_permission

作用:

  • 表示某个主体对某个资源的授权结果

核心字段:

字段说明
id主键
subject_type主体类型:USER / ROLE / ORG
subject_id主体 ID
resource_type资源类型:MENU / BUTTON
resource_id资源 ID
effect效果:Allow / Deny
scope权限范围,默认 ALL
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_permission(subject_type, subject_id, resource_type, resource_id)
  • 索引:idx_permission_subject(subject_type, subject_id)
  • 索引:idx_permission_resource(resource_type, resource_id)
  • 索引:idx_permission_effect(effect)

3.9 OAuth2 账户表 auth_oauth2_account

作用:

  • 存储第三方账号与本地用户绑定关系

核心字段:

字段说明
id主键
user_id本地用户 ID
provider_id提供商 ID
provider_user_id提供商用户 ID
provider_attributes提供商返回的用户属性 JSON
linked_at绑定时间
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_provider_user(provider_id, provider_user_id)
  • 索引:idx_oauth2_account_user_id(user_id)

3.10 OAuth2 客户端表 auth_oauth2_client

作用:

  • 存储 OAuth2 客户端配置
  • 用于第三方授权接入管理

核心字段:

字段说明
id主键
client_id客户端 ID
client_secret客户端密钥
client_name客户端名称
grant_types授权类型
scopes授权范围
redirect_uris重定向 URI,换行分隔
auto_approve是否自动批准
access_token_validityaccess token 有效期(秒)
refresh_token_validityrefresh token 有效期(秒)
additional_information额外信息 JSON
status状态
create_time创建时间
update_time更新时间

关键约束:

  • 唯一键:uk_client_id(client_id)
  • 索引:idx_oauth2_client_status(status)

4. 初始化 SQL 原文

当前模块提供的初始化 SQL 如下:

SET NAMES utf8mb4;
SET character_set_client = utf8mb4;
SET character_set_connection = utf8mb4;
SET character_set_results = utf8mb4;
SET collation_connection = utf8mb4_unicode_ci;
SET FOREIGN_KEY_CHECKS = 0;

CREATE TABLE IF NOT EXISTS `auth_user` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`username` VARCHAR(50) NOT NULL COMMENT '用户名,唯一',
`password` VARCHAR(100) NOT NULL COMMENT '密码',
`nickname` VARCHAR(50) DEFAULT NULL COMMENT '昵称',
`avatar` VARCHAR(500) DEFAULT NULL COMMENT '头像URL',
`email` VARCHAR(50) DEFAULT NULL COMMENT '邮箱',
`phone` VARCHAR(50) DEFAULT NULL COMMENT '手机号',
`status` SMALLINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_username` (`username`),
KEY `idx_user_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户表';

CREATE TABLE IF NOT EXISTS `auth_role` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`code` VARCHAR(50) NOT NULL COMMENT '角色编码,唯一',
`name` VARCHAR(50) NOT NULL COMMENT '角色名称',
`description` VARCHAR(200) DEFAULT NULL COMMENT '描述',
`status` SMALLINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_role_code` (`code`),
KEY `idx_role_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='角色表';

CREATE TABLE IF NOT EXISTS `auth_org` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`name` VARCHAR(100) NOT NULL COMMENT '组织名称',
`parent_id` CHAR(32) DEFAULT NULL COMMENT '父组织ID,NULL为根节点',
`path` VARCHAR(500) DEFAULT NULL COMMENT '层级路径',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序,越大越靠前',
`code` VARCHAR(50) NOT NULL COMMENT '组织编码,唯一',
`type` VARCHAR(32) NOT NULL COMMENT '类型:COMPANY公司 DEPARTMENT部门 TEAM小组',
`status` SMALLINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_org_code` (`code`),
KEY `idx_org_status` (`status`),
KEY `idx_org_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='组织表';

CREATE TABLE IF NOT EXISTS `auth_user_org` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`user_id` CHAR(32) NOT NULL COMMENT '用户ID',
`org_id` CHAR(32) NOT NULL COMMENT '组织ID',
`primary_flag` TINYINT NOT NULL DEFAULT 0 COMMENT '是否主组织:0否 1是',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_org` (`user_id`, `org_id`),
KEY `idx_user_org_user_id` (`user_id`),
KEY `idx_user_org_org_id` (`org_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户-组织关联表';

CREATE TABLE IF NOT EXISTS `auth_user_role` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`user_id` CHAR(32) NOT NULL COMMENT '用户ID',
`role_id` CHAR(32) NOT NULL COMMENT '角色ID',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_user_role` (`user_id`, `role_id`),
KEY `idx_user_role_user_id` (`user_id`),
KEY `idx_user_role_role_id` (`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='用户-角色关联表';

CREATE TABLE IF NOT EXISTS `auth_menu` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`name` VARCHAR(100) NOT NULL COMMENT '菜单名称',
`parent_id` CHAR(32) DEFAULT NULL COMMENT '父菜单ID,NULL为根节点',
`path` VARCHAR(200) DEFAULT NULL COMMENT '路由路径',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`code` VARCHAR(100) NOT NULL COMMENT '菜单编码,唯一',
`icon` VARCHAR(50) DEFAULT NULL COMMENT '图标',
`component` VARCHAR(200) DEFAULT NULL COMMENT '前端组件路径',
`type` VARCHAR(100) DEFAULT NULL COMMENT '类型:菜单组、菜单、外链',
`status` SMALLINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`hidden` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否隐藏:0否 1是',
`external_flag` TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否外链:0否 1是',
`external_url` VARCHAR(500) DEFAULT NULL COMMENT '外链地址',
`visible_in_breadcrumb` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否显示在面包屑:0否 1是',
`visible_in_tab` TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否显示在标签页:0否 1是',
`active_menu_path` VARCHAR(200) DEFAULT NULL COMMENT '激活菜单路径',
`remark` VARCHAR(500) DEFAULT NULL COMMENT '备注',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_menu_code` (`code`),
KEY `idx_menu_status` (`status`),
KEY `idx_menu_parent_id` (`parent_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='菜单表';

CREATE TABLE IF NOT EXISTS `auth_button` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`menu_id` CHAR(32) NOT NULL COMMENT '所属菜单ID',
`code` VARCHAR(100) NOT NULL COMMENT '按钮编码,唯一',
`name` VARCHAR(100) NOT NULL COMMENT '按钮名称',
`type` VARCHAR(20) DEFAULT NULL COMMENT '按钮类型:add/edit/delete/export等',
`sort` INT NOT NULL DEFAULT 0 COMMENT '排序号',
`status` SMALLINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_button_code` (`code`),
KEY `idx_button_status` (`status`),
KEY `idx_button_menu_id` (`menu_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='按钮表';

CREATE TABLE IF NOT EXISTS `auth_permission` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`subject_type` VARCHAR(20) NOT NULL COMMENT '主体类型:USER/ROLE/ORG',
`subject_id` CHAR(32) NOT NULL COMMENT '主体ID',
`resource_type` VARCHAR(20) NOT NULL COMMENT '资源类型:MENU/BUTTON',
`resource_id` CHAR(32) NOT NULL COMMENT '资源ID',
`effect` VARCHAR(100) NOT NULL DEFAULT 'Allow' COMMENT '效果:Allow(授权)或 Deny(拒绝)',
`scope` VARCHAR(100) NOT NULL DEFAULT 'ALL' COMMENT '权限范围,默认ALL',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_permission` (`subject_type`, `subject_id`, `resource_type`, `resource_id`),
KEY `idx_permission_subject` (`subject_type`, `subject_id`),
KEY `idx_permission_resource` (`resource_type`, `resource_id`),
KEY `idx_permission_effect` (`effect`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='权限表';

CREATE TABLE IF NOT EXISTS `auth_oauth2_account` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`user_id` CHAR(32) NOT NULL COMMENT '用户ID',
`provider_id` VARCHAR(50) NOT NULL COMMENT '提供商ID',
`provider_user_id` VARCHAR(100) NOT NULL COMMENT '提供商用户ID',
`provider_attributes` TEXT DEFAULT NULL COMMENT '提供商返回的用户属性(JSON)',
`linked_at` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '绑定时间',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_provider_user` (`provider_id`, `provider_user_id`),
KEY `idx_oauth2_account_user_id` (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OAuth2账户表';

CREATE TABLE IF NOT EXISTS `auth_oauth2_client` (
`id` CHAR(32) NOT NULL COMMENT '主键,UUID v7',
`client_id` VARCHAR(100) NOT NULL COMMENT '客户端ID(OAuth2使用)',
`client_secret` VARCHAR(255) NOT NULL COMMENT '客户端密钥',
`client_name` VARCHAR(100) NOT NULL COMMENT '客户端名称',
`grant_types` VARCHAR(500) NOT NULL COMMENT '授权类型',
`scopes` VARCHAR(500) NOT NULL COMMENT '授权范围',
`redirect_uris` TEXT NOT NULL COMMENT '重定向URI,换行分隔',
`auto_approve` TINYINT NOT NULL DEFAULT 0 COMMENT '是否自动批准:0否 1是',
`access_token_validity` INT NOT NULL DEFAULT 7200 COMMENT '访问令牌有效期(秒)',
`refresh_token_validity` INT NOT NULL DEFAULT 604800 COMMENT '刷新令牌有效期(秒)',
`additional_information` TEXT DEFAULT NULL COMMENT '额外信息(JSON)',
`status` SMALLINT NOT NULL DEFAULT 1 COMMENT '状态:0禁用 1启用',
`create_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
PRIMARY KEY (`id`),
UNIQUE KEY `uk_client_id` (`client_id`),
KEY `idx_oauth2_client_status` (`status`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='OAuth2客户端表';

SET FOREIGN_KEY_CHECKS = 1;

5. 组织类型迁移脚本

当前还提供了一份组织类型迁移脚本,用于把旧的数字语义迁移到显式字符串类型:

ALTER TABLE `auth_org`
MODIFY COLUMN `type` VARCHAR(32) NOT NULL COMMENT '类型:COMPANY公司 DEPARTMENT部门 TEAM小组';

UPDATE `auth_org`
SET `type` = CASE `type`
WHEN '1' THEN 'COMPANY'
WHEN '2' THEN 'DEPARTMENT'
WHEN '3' THEN 'TEAM'
ELSE `type`
END
WHERE `type` IN ('1', '2', '3');

迁移含义:

  • 1COMPANY
  • 2DEPARTMENT
  • 3TEAM

这个迁移让组织类型从“只能靠约定记忆的数字值”升级为“具有明确业务语义的枚举字符串”,可读性更高,也更方便接口层直接透出。