oh-my-muse/muse-cloud/sql/dev/yudao-base-seed-postgres.sql
lili 92b90878ec fix(solo): 补齐单人版登录栈种子与 OAuth2 scopes 兜底
单人版真实登录(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>
2026-07-07 22:41:29 -07:00

146 lines
8.2 KiB
SQL
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

-- =============================================================================
-- Muse 全栈 app 最小启动种子PostgreSQL
-- 适用muse-serverspring profile = local,inframuse.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 基座BaseDOdeleted 为 booleantenant_id 为 bigint
-- 审计列 creator/create_time/updater/update_time 均有默认值。id 显式给定INPUT 模式)。
-- 全部 INSERT 幂等ON CONFLICT (id) DO NOTHING可重复执行。
-- =============================================================================
-- -----------------------------------------------------------------------------
-- [必需] 默认租户 system_tenant(id=1)
-- status=0 启用CommonStatusEnum.ENABLE=0DISABLE=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 存在和启用,不读取 secretsecret 留空避免沉淀无用凭据。
-- -----------------------------------------------------------------------------
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 建表脚本补齐,再执行本种子。
-- =============================================================================