feat(wxcp): 默认角色补首页数据权限,修一进首页就报没有权限
首页 /analytics 是前端静态路由、人人可见,但它内部会调 4 个带 @PreAuthorize
的接口拉数据,wxcp_user 只有会员管理,这 4 个全 403,表现为一进首页就报
「没有权限」:
bpm/task/todo-page → bpm:task:query
finance/reimbursement/page → finance:reimbursement:query
research/application/page → research:application:query
research/guideline/page → research:guideline:query
在 wxcp_menu.sql 增加第 5 段授权,并同步进合并初始化脚本。
按 permission 串查而非写死菜单编号(编号各库不一致),只授按钮不授上级菜单,
所以不会往侧边栏塞 BPM / 财务 / 科研的入口。
Co-Authored-By: Claude <noreply@anthropic.com>
| | |
| | | AND `deleted` = b'0') `t` |
| | | WHERE `t`.`user_id` = `u`.`id`); |
| | | |
| | | -- 5) 首页数据权限 |
| | | -- |
| | | -- 首页(/analytics)本身是前端静态路由、人人可见,但它内部会调 4 个后端接口拉数据, |
| | | -- 这些接口都带 @PreAuthorize,角色缺权限时一进首页就报「没有权限」: |
| | | -- bpm/task/todo-page → bpm:task:query |
| | | -- finance/reimbursement/page → finance:reimbursement:query |
| | | -- research/application/page → research:application:query |
| | | -- research/guideline/page → research:guideline:query |
| | | -- |
| | | -- 按 permission 串查、不写死菜单编号:编号在各库不一致,写死换库就失效。 |
| | | -- 只授按钮(type=3)、不授其上级菜单,所以不会往侧边栏塞 BPM / 财务 / 科研的入口。 |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `updater`) |
| | | SELECT @wxcp_role_id, `m`.`id`, 'admin', 'admin' |
| | | FROM `system_menu` `m` |
| | | WHERE `m`.`deleted` = b'0' |
| | | AND `m`.`permission` IN ('bpm:task:query', 'finance:reimbursement:query', |
| | | 'research:application:query', 'research:guideline:query') |
| | | AND @wxcp_role_id IS NOT NULL |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM (SELECT `menu_id` FROM `system_role_menu` |
| | | WHERE `role_id` = @wxcp_role_id |
| | | AND `deleted` = b'0') `t` |
| | | WHERE `t`.`menu_id` = `m`.`id`); |
| | | |
| | | SET FOREIGN_KEY_CHECKS = 1; |
| | |
| | | WHERE `role_id` = @wxcp_role_id |
| | | AND `deleted` = b'0') `t` |
| | | WHERE `t`.`user_id` = `u`.`id`); |
| | | |
| | | -- 5) 首页数据权限 |
| | | -- |
| | | -- 首页(/analytics)本身是前端静态路由、人人可见,但它内部会调 4 个后端接口拉数据, |
| | | -- 这些接口都带 @PreAuthorize,角色缺权限时一进首页就报「没有权限」: |
| | | -- bpm/task/todo-page → bpm:task:query |
| | | -- finance/reimbursement/page → finance:reimbursement:query |
| | | -- research/application/page → research:application:query |
| | | -- research/guideline/page → research:guideline:query |
| | | -- |
| | | -- 按 permission 串查、不写死菜单编号:编号在各库不一致,写死换库就失效。 |
| | | -- 只授按钮(type=3)、不授其上级菜单,所以不会往侧边栏塞 BPM / 财务 / 科研的入口。 |
| | | INSERT INTO `system_role_menu` (`role_id`, `menu_id`, `creator`, `updater`) |
| | | SELECT @wxcp_role_id, `m`.`id`, 'admin', 'admin' |
| | | FROM `system_menu` `m` |
| | | WHERE `m`.`deleted` = b'0' |
| | | AND `m`.`permission` IN ('bpm:task:query', 'finance:reimbursement:query', |
| | | 'research:application:query', 'research:guideline:query') |
| | | AND @wxcp_role_id IS NOT NULL |
| | | AND NOT EXISTS ( |
| | | SELECT 1 FROM (SELECT `menu_id` FROM `system_role_menu` |
| | | WHERE `role_id` = @wxcp_role_id |
| | | AND `deleted` = b'0') `t` |
| | | WHERE `t`.`menu_id` = `m`.`id`); |
| | |
| | | | 场景 | 规则 | |
| | | |------|------| |
| | | | 企业微信首次扫码(未绑定) | 自动创建系统用户,用户名为 `wx_` + 8 位随机十六进制,昵称取企业微信昵称,账号状态为启用,随机生成密码(用户无需知晓,仅用于占位) | |
| | | | 首次注册后的默认权限 | 绑定角色 `wxcp_user`,**仅授予「会员管理」整棵子树**(根目录 1075490 + 3 个菜单 + 10 个按钮,共 **14 条**;SQL 见 `docs/sql/wxcp_menu.sql` 末尾)。首页不受菜单表控制:它是前端静态路由(`src/router/routes/modules/dashboard.ts` 里的 `/analytics`),backend 模式下由 `generateRoutesByBackend` 末尾的 `return [...options.routes, ...routes]` 始终合并进来,任何登录用户都可见、也无需授权——所以「角色管理」的菜单树里**根本找不到「首页」**,这是正常的,不是漏配。角色缺失时代码只记 warn 日志、不阻断登录,表现为「能进系统但菜单全空」 | |
| | | | 首次注册后的默认权限 | 绑定角色 `wxcp_user`,**仅授予「会员管理」整棵子树**(根目录 1075490 + 3 个菜单 + 10 个按钮,共 **14 条**;SQL 见 `docs/sql/wxcp_menu.sql` 末尾)。首页不受菜单表控制:它是前端静态路由(`src/router/routes/modules/dashboard.ts` 里的 `/analytics`),backend 模式下由 `generateRoutesByBackend` 末尾的 `return [...options.routes, ...routes]` 始终合并进来,任何登录用户都可见、也无需授权——所以「角色管理」的菜单树里**根本找不到「首页」**,这是正常的,不是漏配。角色缺失时代码只记 warn 日志、不阻断登录,表现为「能进系统但菜单全空」。**另外还要授 4 个首页按钮权限**(`wxcp_menu.sql` 第 5 段):首页虽然是静态路由人人可见,但它内部会调 `bpm/task/todo-page`、`finance/reimbursement/page`、`research/application/page`、`research/guideline/page` 这 4 个带 `@PreAuthorize` 的接口拉数据,不授就一进首页报「没有权限」。只授按钮、不授上级菜单,不会往侧边栏塞 BPM / 财务 / 科研入口 | |
| | | | 企业微信再次扫码(已绑定) | 直接登录,不创建新用户 | |
| | | | 非企业微信的社交平台首次登录 | 仍返回 `1_002_000_005`「未绑定账号,需要进行绑定」,需引导用户走账号密码登录并绑定 | |
| | | | 账号密码登录时携带社交参数 | 走原有绑定逻辑,登录成功后该社交账号与账号绑定 | |