单人版真实登录(admin 后台 / member studio)所需的基座种子与兜底: - OAuth2TokenServiceImpl.createAccessToken 增加 normalizeScopes:登录链路不显式传 scope, 但 PG token 表 scopes 非空约束 → 无兜底会写入失败;统一兜底到客户端默认授权范围。 - yudao-base-seed 补 admin(admin123, status=0)+ super_admin 角色绑定 + default OAuth2 client + member 测试账号 15601691388(admin123);ON CONFLICT DO UPDATE 幂等。 - yudao-base-schema / create_tables 给 system_login_log 补 tenant_id(登录写访问日志需要)。 - muse-slice-sequences-repair 补 system_oauth2_* 与 demo 序列;OAuth2 access/refresh token 复用同一 @KeySequence,按两表 GREATEST 对齐,避免 nextval 撞已存在 id。 验证:OAuth2TokenServiceImplTest 14 tests/0 fail(含新增 testCreateAccessToken_nullScopesUseClientScopes); 种子已灌入 muse_slice_live(admin/member/oauth2 client/user_role/tenant 全就位、口令哈希 = admin123)。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
146 lines
8.2 KiB
SQL
146 lines
8.2 KiB
SQL
-- =============================================================================
|
||
-- Muse 全栈 app 最小启动种子(PostgreSQL)
|
||
-- 适用:muse-server,spring profile = local,infra,muse.security.mock-enable=true
|
||
-- 目标库:已含【yudao 基座表 system_*/infra_*】+【Muse Flyway V1-V21】的 PG 库
|
||
-- 目标:让 app 启动成功 + 放行/服务 /app-api/muse/**
|
||
--
|
||
-- 关键结论(基于只读代码核查,非猜测):
|
||
-- 1) 每个 app-api 请求都会先走 TokenAuthenticationFilter:
|
||
-- checkAccessToken(token) -> system_oauth2_access_token / system_oauth2_refresh_token
|
||
-- (查不到再回退到 mock 登录)。这两张表必须【存在】(yudao 基座表,已假定存在),
|
||
-- 但【无需任何种子行】——mock token 命中不了它们正是预期路径。
|
||
-- 2) muse.tenant.enable=true 时,TenantSecurityWebFilter 对非 ignore 的 app-api 请求
|
||
-- 调用 validTenant(tenantId),校验 system_tenant:存在 + status 启用 + 未过期。
|
||
-- => 这是本种子【唯一强制】的一行:system_tenant(id=1)。
|
||
-- 3) validTenant 不连表查 system_tenant_package / system_users / system_role,
|
||
-- 故这些表对“app 启动 + /app-api/muse/** 放行”不是必需;下文按“可选”给出,
|
||
-- 仅为后续 admin-api 登录 / 跨租户场景方便。
|
||
--
|
||
-- 列布局对齐真实 PG yudao 基座(BaseDO):deleted 为 boolean,tenant_id 为 bigint,
|
||
-- 审计列 creator/create_time/updater/update_time 均有默认值。id 显式给定(INPUT 模式)。
|
||
-- 全部 INSERT 幂等:ON CONFLICT (id) DO NOTHING,可重复执行。
|
||
-- =============================================================================
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [必需] 默认租户 system_tenant(id=1)
|
||
-- status=0 启用(CommonStatusEnum.ENABLE=0;DISABLE=1)
|
||
-- expire_time 设到 2099 远未来,避免 DateUtils.isExpired 触发 TENANT_EXPIRE
|
||
-- package_id=1:仅为列非空占位(yudao 无外键约束,不要求 package 行真实存在)
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO system_tenant
|
||
(id, name, contact_user_id, contact_name, contact_mobile, status, websites,
|
||
package_id, expire_time, account_count,
|
||
creator, create_time, updater, update_time, deleted)
|
||
VALUES
|
||
(1, '芋道源码', 1, 'Muse', '15601691300', 0, '',
|
||
1, TIMESTAMP '2099-12-31 23:59:59', 1000,
|
||
'1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE)
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- =============================================================================
|
||
-- 以下均为【可选】:/app-api/muse/** 的 mock 路径不需要它们。
|
||
-- 仅当你还想跑 admin-api 登录、或希望 getTenantIdList/套餐相关逻辑数据完整时再放开。
|
||
-- =============================================================================
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [可选] 租户套餐 system_tenant_package(id=1):status=0 启用
|
||
-- menu_ids 用 '[]' 占位(DO 内是 Set<Long>,JSON 数组字符串)
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO system_tenant_package
|
||
(id, name, status, remark, menu_ids,
|
||
creator, create_time, updater, update_time, deleted)
|
||
VALUES
|
||
(1, '系统租户套餐', 0, '最小启动占位', '[]',
|
||
'1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE)
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [可选] 管理员 system_users(id=1):status=0 启用,tenant_id=1
|
||
-- 开发/内部测试口令:admin123。该哈希由 Spring Security BCryptPasswordEncoder(4)
|
||
-- 生成,并已用 matches("admin123", hash) 验证;不要把外部真实凭据写入本种子。
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO system_users
|
||
(id, username, password, nickname, remark, dept_id, post_ids,
|
||
email, mobile, sex, avatar, status, login_ip, login_date,
|
||
creator, create_time, updater, update_time, deleted, tenant_id)
|
||
VALUES
|
||
(1, 'admin',
|
||
'$2a$04$6/4tJb8ZRIX8NnDzbRj.neUWQmZ84E4rdrO0vVmfwC2QpoyXbv7Im',
|
||
'芋道源码', '管理员', NULL, NULL,
|
||
'aoteman@126.com', '15612345678', 1, '', 0, '', NULL,
|
||
'1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE, 1)
|
||
ON CONFLICT (id) DO UPDATE SET
|
||
password = EXCLUDED.password,
|
||
status = EXCLUDED.status,
|
||
tenant_id = EXCLUDED.tenant_id,
|
||
update_time = CURRENT_TIMESTAMP;
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [可选] 超级管理员角色 system_role(id=1):type=1 内置,data_scope=1 全部,status=0 启用
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO system_role
|
||
(id, name, code, sort, data_scope, data_scope_dept_ids, status, type, remark,
|
||
creator, create_time, updater, update_time, deleted, tenant_id)
|
||
VALUES
|
||
(1, '超级管理员', 'super_admin', 1, 1, '', 0, 1, '内置角色',
|
||
'1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE, 1)
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [可选] admin -> 超级管理员角色绑定。没有该绑定时能登录但无管理权限。
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO system_user_role
|
||
(id, user_id, role_id, creator, create_time, updater, update_time, deleted, tenant_id)
|
||
VALUES
|
||
(1, 1, 1, '1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE, 1)
|
||
ON CONFLICT (id) DO NOTHING;
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [可选] 默认 OAuth2 客户端。后台/会员登录成功后都通过 client_id=default 创建 token。
|
||
-- 当前登录路径只校验 client_id 存在和启用,不读取 secret;secret 留空避免沉淀无用凭据。
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO system_oauth2_client
|
||
(id, client_id, secret, name, logo, description, status,
|
||
access_token_validity_seconds, refresh_token_validity_seconds,
|
||
redirect_uris, authorized_grant_types, scopes, auto_approve_scopes,
|
||
authorities, resource_ids, additional_information,
|
||
creator, create_time, updater, update_time, deleted)
|
||
VALUES
|
||
(1, 'default', '', '默认客户端', '', '开发/内部测试默认 OAuth2 客户端', 0,
|
||
7200, 2592000,
|
||
'["https://www.iocoder.cn"]',
|
||
'["password","authorization_code","implicit","client_credentials","refresh_token"]',
|
||
'["user.read"]', '["user.read"]',
|
||
'[]', '[]', '{}',
|
||
'1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE)
|
||
ON CONFLICT (id) DO UPDATE SET
|
||
client_id = EXCLUDED.client_id,
|
||
status = EXCLUDED.status,
|
||
update_time = CURRENT_TIMESTAMP;
|
||
|
||
-- -----------------------------------------------------------------------------
|
||
-- [可选] Studio 会员测试账号。前端登录页和 HTTP 样例均使用 15601691388/admin123。
|
||
-- -----------------------------------------------------------------------------
|
||
INSERT INTO member_user
|
||
(id, nickname, avatar, status, mobile, password, register_ip, login_ip, login_date,
|
||
point, tag_ids, level_id, experience, group_id, register_terminal,
|
||
creator, create_time, updater, update_time, deleted, tenant_id)
|
||
VALUES
|
||
(1, 'Muse 测试用户', '', 0, '15601691388',
|
||
'$2a$04$6/4tJb8ZRIX8NnDzbRj.neUWQmZ84E4rdrO0vVmfwC2QpoyXbv7Im',
|
||
'127.0.0.1', '', NULL,
|
||
0, NULL, 0, 0, 0, 20,
|
||
'1', CURRENT_TIMESTAMP, '1', CURRENT_TIMESTAMP, FALSE, 1)
|
||
ON CONFLICT (id) DO UPDATE SET
|
||
mobile = EXCLUDED.mobile,
|
||
password = EXCLUDED.password,
|
||
status = EXCLUDED.status,
|
||
tenant_id = EXCLUDED.tenant_id,
|
||
update_time = CURRENT_TIMESTAMP;
|
||
|
||
-- =============================================================================
|
||
-- 说明:本种子不创建任何表。若启动报 “relation does not exist”,说明目标库缺少
|
||
-- 对应 yudao 基座表(最常见:system_oauth2_access_token / system_oauth2_refresh_token /
|
||
-- infra_* 系列),需要先用 yudao 基座 PG 建表脚本补齐,再执行本种子。
|
||
-- =============================================================================
|