实现登录权限底座

This commit is contained in:
andy
2026-07-09 19:31:20 +08:00
parent a5a251a3f3
commit 666fb41328
77 changed files with 3946 additions and 19 deletions

View File

@@ -56,6 +56,19 @@ debug:
access-key: ${DEBUG_EML_UPLOAD_DEV_ACCESS_KEY:${DEBUG_EML_UPLOAD_ACCESS_KEY:}}
max-file-bytes: ${DEBUG_EML_UPLOAD_DEV_MAX_FILE_BYTES:${DEBUG_EML_UPLOAD_MAX_FILE_BYTES:10485760}}
auth:
bootstrap:
admin:
# dev 初始超级管理员只在系统没有超级管理员时创建;密码必须走环境变量。
username: ${AUTH_DEV_BOOTSTRAP_ADMIN_USERNAME:${AUTH_BOOTSTRAP_ADMIN_USERNAME:}}
password: ${AUTH_DEV_BOOTSTRAP_ADMIN_PASSWORD:${AUTH_BOOTSTRAP_ADMIN_PASSWORD:}}
display-name: ${AUTH_DEV_BOOTSTRAP_ADMIN_DISPLAY_NAME:${AUTH_BOOTSTRAP_ADMIN_DISPLAY_NAME:系统管理员}}
default-hotel-id: ${AUTH_DEV_BOOTSTRAP_DEFAULT_HOTEL_ID:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_ID:HOTEL-DEV}}
default-hotel-name: ${AUTH_DEV_BOOTSTRAP_DEFAULT_HOTEL_NAME:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_NAME:开发酒店}}
default-hotel-time-zone: ${AUTH_DEV_BOOTSTRAP_DEFAULT_HOTEL_TIME_ZONE:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_TIME_ZONE:Asia/Bangkok}}
session:
ttl-minutes: ${AUTH_DEV_SESSION_TTL_MINUTES:${AUTH_SESSION_TTL_MINUTES:720}}
reservation:
demo-data:
# dev 本地联调默认开启演示数据造数接口;生产环境不得开启。

View File

@@ -54,6 +54,19 @@ debug:
access-key: ${DEBUG_EML_UPLOAD_PROD_ACCESS_KEY:${DEBUG_EML_UPLOAD_ACCESS_KEY}}
max-file-bytes: ${DEBUG_EML_UPLOAD_PROD_MAX_FILE_BYTES:${DEBUG_EML_UPLOAD_MAX_FILE_BYTES:10485760}}
auth:
bootstrap:
admin:
# prod 初始超级管理员必须通过生产 Secret 注入;系统已有超级管理员后不会覆盖。
username: ${AUTH_PROD_BOOTSTRAP_ADMIN_USERNAME:${AUTH_BOOTSTRAP_ADMIN_USERNAME}}
password: ${AUTH_PROD_BOOTSTRAP_ADMIN_PASSWORD:${AUTH_BOOTSTRAP_ADMIN_PASSWORD}}
display-name: ${AUTH_PROD_BOOTSTRAP_ADMIN_DISPLAY_NAME:${AUTH_BOOTSTRAP_ADMIN_DISPLAY_NAME:系统管理员}}
default-hotel-id: ${AUTH_PROD_BOOTSTRAP_DEFAULT_HOTEL_ID:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_ID}}
default-hotel-name: ${AUTH_PROD_BOOTSTRAP_DEFAULT_HOTEL_NAME:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_NAME}}
default-hotel-time-zone: ${AUTH_PROD_BOOTSTRAP_DEFAULT_HOTEL_TIME_ZONE:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_TIME_ZONE:Asia/Bangkok}}
session:
ttl-minutes: ${AUTH_PROD_SESSION_TTL_MINUTES:${AUTH_SESSION_TTL_MINUTES:720}}
reservation:
demo-data:
# prod 永远不启用演示数据造数接口。

View File

@@ -56,6 +56,19 @@ debug:
access-key: ${DEBUG_EML_UPLOAD_TEST_ACCESS_KEY:${DEBUG_EML_UPLOAD_ACCESS_KEY:}}
max-file-bytes: ${DEBUG_EML_UPLOAD_TEST_MAX_FILE_BYTES:${DEBUG_EML_UPLOAD_MAX_FILE_BYTES:10485760}}
auth:
bootstrap:
admin:
# test 初始超级管理员只在系统没有超级管理员时创建;密码必须走环境变量。
username: ${AUTH_TEST_BOOTSTRAP_ADMIN_USERNAME:${AUTH_BOOTSTRAP_ADMIN_USERNAME:}}
password: ${AUTH_TEST_BOOTSTRAP_ADMIN_PASSWORD:${AUTH_BOOTSTRAP_ADMIN_PASSWORD:}}
display-name: ${AUTH_TEST_BOOTSTRAP_ADMIN_DISPLAY_NAME:${AUTH_BOOTSTRAP_ADMIN_DISPLAY_NAME:系统管理员}}
default-hotel-id: ${AUTH_TEST_BOOTSTRAP_DEFAULT_HOTEL_ID:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_ID:HOTEL-TEST}}
default-hotel-name: ${AUTH_TEST_BOOTSTRAP_DEFAULT_HOTEL_NAME:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_NAME:测试酒店}}
default-hotel-time-zone: ${AUTH_TEST_BOOTSTRAP_DEFAULT_HOTEL_TIME_ZONE:${AUTH_BOOTSTRAP_DEFAULT_HOTEL_TIME_ZONE:Asia/Bangkok}}
session:
ttl-minutes: ${AUTH_TEST_SESSION_TTL_MINUTES:${AUTH_SESSION_TTL_MINUTES:720}}
reservation:
demo-data:
# test 默认关闭演示数据造数接口,需要联调时显式开启并配置访问口令。

View File

@@ -27,6 +27,11 @@ superagent:
nonce-ttl-seconds: 600
max-body-bytes: 1048576
auth:
session:
# 登录 session 默认 12 小时;各环境可通过 AUTH_*_SESSION_TTL_MINUTES 覆盖。
ttl-minutes: ${AUTH_SESSION_TTL_MINUTES:720}
mcp:
# SuperAgent MCP 默认关闭;启用时必须通过部署环境配置高熵 Bearer Token。
enabled: ${MCP_ENABLED:false}

View File

@@ -0,0 +1,138 @@
-- M003 登录权限底座:本系统用户账号表,密码只保存单向哈希。
CREATE TABLE platform_user (
id BIGINT NOT NULL COMMENT '用户内部 ID',
username VARCHAR(128) NOT NULL COMMENT '登录用户名,全局唯一',
password_hash VARCHAR(128) NOT NULL COMMENT '密码单向哈希,禁止保存明文密码',
display_name VARCHAR(128) NOT NULL COMMENT '用户展示名称',
email VARCHAR(256) NULL COMMENT '用户邮箱,第一版可为空',
phone VARCHAR(64) NULL COMMENT '用户手机号,第一版可为空',
user_status VARCHAR(32) NOT NULL COMMENT '用户状态ACTIVE、DISABLED',
super_admin TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否超级管理员,超级管理员默认可访问全部启用酒店',
password_changed_at DATETIME(6) NULL COMMENT '最近密码变更 UTC 时间',
last_login_at DATETIME(6) NULL COMMENT '最近登录 UTC 时间',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_user_username (username),
KEY idx_platform_user_status (user_status)
) COMMENT='平台用户账号表,保存本系统登录用户基础信息';
-- M003 登录权限底座:数据库 session 表,只保存 token_hash。
CREATE TABLE platform_user_session (
id BIGINT NOT NULL COMMENT '用户 session 内部 ID',
user_id BIGINT NOT NULL COMMENT '所属用户 ID',
token_hash CHAR(64) NOT NULL COMMENT 'access token 的 SHA-256 哈希,数据库不保存明文 token',
session_status VARCHAR(32) NOT NULL COMMENT 'session 状态ACTIVE、REVOKED、EXPIRED',
issued_at DATETIME(6) NOT NULL COMMENT 'token 签发 UTC 时间',
expires_at DATETIME(6) NOT NULL COMMENT 'token 过期 UTC 时间',
revoked_at DATETIME(6) NULL COMMENT '注销或撤销 UTC 时间',
last_seen_at DATETIME(6) NULL COMMENT '最近使用 UTC 时间',
client_ip VARCHAR(64) NULL COMMENT '登录或最近请求 IP第一版可为空',
user_agent_summary VARCHAR(256) NULL COMMENT 'User-Agent 摘要,第一版可为空',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_user_session_token_hash (token_hash),
KEY idx_platform_user_session_user_status (user_id, session_status),
KEY idx_platform_user_session_expires_at (expires_at)
) COMMENT='平台用户登录 session 表,用于数据库 session token 登录态';
-- M003 登录权限底座:角色表。
CREATE TABLE platform_role (
id BIGINT NOT NULL COMMENT '角色内部 ID',
role_code VARCHAR(128) NOT NULL COMMENT '稳定角色代码,例如 SYSTEM_ADMIN',
role_name VARCHAR(128) NOT NULL COMMENT '角色展示名称',
role_status VARCHAR(32) NOT NULL COMMENT '角色状态ACTIVE、DISABLED',
system_builtin TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否系统内置角色',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_role_code (role_code),
KEY idx_platform_role_status (role_status)
) COMMENT='平台角色表,保存本系统稳定角色定义';
-- M003 登录权限底座:权限码表。
CREATE TABLE platform_permission (
id BIGINT NOT NULL COMMENT '权限内部 ID',
permission_code VARCHAR(128) NOT NULL COMMENT '稳定权限代码,业务判断只能使用该字段',
permission_name VARCHAR(128) NOT NULL COMMENT '权限展示名称',
permission_group VARCHAR(64) NOT NULL COMMENT '权限分组,例如 RESERVATION、SOURCE_MESSAGE、SYSTEM',
permission_status VARCHAR(32) NOT NULL COMMENT '权限状态ACTIVE、DISABLED',
system_builtin TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否系统内置权限',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_permission_code (permission_code),
KEY idx_platform_permission_group (permission_group, permission_status)
) COMMENT='平台权限码表,保存后端和前端共同使用的稳定权限代码';
-- M003 登录权限底座:用户角色关系。
CREATE TABLE platform_user_role (
id BIGINT NOT NULL COMMENT '用户角色关系 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
role_id BIGINT NOT NULL COMMENT '角色 ID',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_user_role_user_role (user_id, role_id),
KEY idx_platform_user_role_role (role_id)
) COMMENT='平台用户角色关系表';
-- M003 登录权限底座:角色权限关系。
CREATE TABLE platform_role_permission (
id BIGINT NOT NULL COMMENT '角色权限关系 ID',
role_id BIGINT NOT NULL COMMENT '角色 ID',
permission_id BIGINT NOT NULL COMMENT '权限 ID',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_role_permission_role_perm (role_id, permission_id),
KEY idx_platform_role_permission_perm (permission_id)
) COMMENT='平台角色权限关系表';
-- M003 登录权限底座:酒店基础信息。
CREATE TABLE platform_hotel (
id BIGINT NOT NULL COMMENT '酒店内部 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '业务酒店 ID例如 HOTEL-TEST',
hotel_name VARCHAR(128) NOT NULL COMMENT '酒店展示名称',
hotel_status VARCHAR(32) NOT NULL COMMENT '酒店状态ACTIVE、DISABLED',
time_zone VARCHAR(64) NOT NULL COMMENT '酒店本地时区,例如 Asia/Bangkok',
sort_order INT NOT NULL DEFAULT 0 COMMENT '菜单或选择器排序号',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_hotel_business_id (hotel_id),
KEY idx_platform_hotel_status_sort (hotel_status, sort_order)
) COMMENT='平台酒店基础信息表,用于登录态和业务酒店上下文授权';
-- M003 登录权限底座:普通用户酒店授权关系。
CREATE TABLE platform_user_hotel (
id BIGINT NOT NULL COMMENT '用户酒店授权关系 ID',
user_id BIGINT NOT NULL COMMENT '用户 ID',
hotel_id VARCHAR(64) NOT NULL COMMENT '酒店业务 ID',
default_hotel TINYINT(1) NOT NULL DEFAULT 0 COMMENT '是否该用户默认酒店',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_user_hotel_user_hotel (user_id, hotel_id),
KEY idx_platform_user_hotel_default (user_id, default_hotel)
) COMMENT='平台用户酒店授权关系表,普通用户只可访问授权酒店';
-- M003 登录权限底座:菜单定义表。
CREATE TABLE platform_menu (
id BIGINT NOT NULL COMMENT '菜单内部 ID',
parent_id BIGINT NULL COMMENT '父菜单 ID根菜单为空',
menu_code VARCHAR(128) NOT NULL COMMENT '稳定菜单代码',
menu_name VARCHAR(128) NOT NULL COMMENT '菜单展示名称',
menu_type VARCHAR(32) NOT NULL COMMENT '菜单类型GROUP、PAGE、ACTION',
route_path VARCHAR(256) NULL COMMENT '前端路由路径',
component_key VARCHAR(128) NULL COMMENT '前端组件标识,第一版可为空',
icon_key VARCHAR(128) NULL COMMENT '前端图标标识,第一版兼容 PrimeIcons class',
permission_code VARCHAR(128) NULL COMMENT '访问该菜单需要的权限码,可为空',
sort_order INT NOT NULL DEFAULT 0 COMMENT '菜单排序号',
visible TINYINT(1) NOT NULL DEFAULT 1 COMMENT '是否作为菜单入口可见',
menu_status VARCHAR(32) NOT NULL COMMENT '菜单状态ACTIVE、DISABLED',
created_at DATETIME(6) NOT NULL COMMENT '记录创建 UTC 时间',
updated_at DATETIME(6) NOT NULL COMMENT '记录更新 UTC 时间',
PRIMARY KEY (id),
UNIQUE KEY uk_platform_menu_code (menu_code),
KEY idx_platform_menu_parent_sort (parent_id, sort_order),
KEY idx_platform_menu_visible_status (visible, menu_status)
) COMMENT='平台菜单定义表,决定当前用户可见导航入口';