| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- -- =====================================================================
- -- 为 wl-scrm 后端创建 qqflow 专用服务账号
- --
- -- 执行库:qqflow 审批引擎库(qqflowengine)
- -- 用途:wl-scrm 后端内部调用 qqflow(发起/撤回审批、同步进度、
- -- 审批人配置页「同步选中」创建审批人账号/绑定企微)
- --
- -- 为什么需要 super_admin:
- -- · POST /system/user(创建审批人账号)要求 super_admin 或 dept_manager;
- -- · PUT /system/user/{id}/wecom(给已有账号补绑企微)仅允许 super_admin;
- -- · 只授 flow_manager 时,「同步选中」会报「权限不足,无法访问」。
- --
- -- 账号约定:
- -- username = scrm_service
- -- password = 自定义强密码(与 wl-scrm 外置配置 qqflow.service.password 一致)
- --
- -- qqflow 密码使用 BCrypt 存储,先生成哈希再替换下面的占位符:
- -- htpasswd -bnBC 10 "" '你的密码' | tr -d ':\n'
- --
- -- 注意:
- -- · 本脚本创建的是高权限服务账号,密码只放 wl-scrm 服务端外置配置,
- -- 不要提交仓库、不要发到群里;
- -- · 脚本幂等:重复执行会重置该账号密码并补齐 super_admin 角色;
- -- · 如果 username 已被无关账号占用,第 0 步会先查出来,切勿直接覆盖。
- -- =====================================================================
- -- 执行前确认当前库:必须是 qqflowengine。
- -- 如果在 wlscrmcenter 或测试库执行,生产 qqflow 里不会出现这个账号。
- SELECT DATABASE() AS current_database;
- SET @service_username = 'scrm_service';
- -- 替换为 htpasswd 生成的 BCrypt 哈希(60 位,$2a$/$2b$/$2y$ 开头)
- SET @service_password_hash = '<替换为 BCrypt 哈希>';
- SET @super_admin_role_code = 'super_admin';
- -- 0) 执行前检查:用户名是否已被占用
- -- 有结果时先确认是不是本次要重置的账号;如果是别人在用的账号,请换一个 username。
- SELECT id, username, real_name, employee_type, status
- FROM sys_user
- WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci;
- -- 1) 校验 super_admin 角色存在且启用
- -- 生产当前应有 id=1 的 super_admin;若没有,请先确认 qqflow 角色模型,不要继续。
- SELECT id, role_code, role_name, role_scope, status
- FROM sys_role
- WHERE role_code COLLATE utf8mb4_general_ci = @super_admin_role_code COLLATE utf8mb4_general_ci;
- -- 2.1) 更新已有账号(仅限本脚本管理的账号)
- -- 只有 real_name 或 employee_type 对得上才更新,避免误改同名但无关的账号
- UPDATE sys_user
- SET password = @service_password_hash,
- real_name = 'SCRM 服务账号',
- employee_type = @super_admin_role_code,
- status = 0,
- wecom_user_id = NULL,
- wecom_remind_enabled = 0,
- update_time = NOW()
- WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci
- AND (real_name = 'SCRM 服务账号' OR employee_type = @super_admin_role_code);
- -- 2.2) 不存在则创建
- -- 若 username 已被无关账号占用,这里不会插入;第 0 步/第 4 步会显示
- -- 该账号的原状态,此时不要继续,换一个 username 后重跑。
- INSERT INTO sys_user
- (username, password, real_name, dept_id, employee_type, status, wecom_remind_enabled)
- SELECT @service_username, @service_password_hash, 'SCRM 服务账号', NULL,
- @super_admin_role_code, 0, 0
- FROM DUAL
- WHERE NOT EXISTS (
- SELECT 1 FROM sys_user
- WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci
- );
- -- 3) 绑定 super_admin 角色(接口鉴权使用)
- -- 只取「本脚本管理的账号」:如果 username 被无关账号占用,这里取不到 id,
- -- 不会给无关账号误绑 super_admin;校验结果会显示该账号仍是原 employee_type。
- SET @service_user_id = (
- SELECT id FROM sys_user
- WHERE username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci
- AND (real_name = 'SCRM 服务账号' OR employee_type = @super_admin_role_code)
- LIMIT 1
- );
- SET @super_admin_role_id = (
- SELECT id FROM sys_role
- WHERE role_code COLLATE utf8mb4_general_ci = @super_admin_role_code COLLATE utf8mb4_general_ci
- LIMIT 1
- );
- INSERT INTO sys_user_role (user_id, role_id)
- SELECT @service_user_id, @super_admin_role_id
- WHERE @service_user_id IS NOT NULL
- AND @super_admin_role_id IS NOT NULL
- AND NOT EXISTS (
- SELECT 1 FROM sys_user_role
- WHERE user_id = @service_user_id
- AND role_id = @super_admin_role_id
- );
- -- 4) 校验:应返回 1 行:
- -- employee_type=super_admin、role_code=super_admin、
- -- pwd_len=60、pwd_prefix=$2a$/$2b$/$2y$(不是 60 位说明哈希没替换/复制错)
- SELECT u.id AS user_id,
- u.username,
- u.employee_type,
- u.status AS user_status,
- CHAR_LENGTH(u.password) AS pwd_len,
- LEFT(u.password, 4) AS pwd_prefix,
- r.id AS role_id,
- r.role_code,
- r.role_name,
- r.status AS role_status
- FROM sys_user u
- LEFT JOIN sys_user_role ur ON ur.user_id = u.id
- LEFT JOIN sys_role r ON r.id = ur.role_id
- WHERE u.username COLLATE utf8mb4_general_ci = @service_username COLLATE utf8mb4_general_ci;
- -- =====================================================================
- -- 执行后还需要在 wl-scrm 生产外置配置(config/application-prod.properties
- -- 或环境变量)中配置,并重启 wl-scrm:
- --
- -- qqflow.service.username=scrm_service
- -- qqflow.service.password=<与上面的明文密码一致>
- --
- -- 如果之前用过其它服务账号,清掉 wl-scrm Redis 中的旧 token(JWT 角色是
- -- 登录时写入的,缓存 23 小时;改密码/改角色后必须清):
- --
- -- redis-cli DEL "TOKEN:QQFLOW:SERVICE:default:scrm_service"
- -- redis-cli DEL "TOKEN:QQFLOW:SERVICE:default:<旧账号>"
- -- =====================================================================
|