-- ============================================================ -- 临时权限修复:学生管理员设置「分配管理范围」 -- 背景: -- 页面:学生管理员设置 / 自定义管理员 / 为【xxx】分配管理范围 -- 提交接口:POST /xgStudentManagerSource/studentManagerSource/grantDeptAuth -- 后端权限:xgStudentManagerSource:studentManagerSource:grantDeptAuth -- 前端无按钮权限控制,点确定后接口 403: -- 黄条「无访问权限,可能原因:1. 用户权限不足…」 -- 红字「分配失败,请重试」 -- 该权限码是后加的自定义接口,菜单里往往没有对应按钮,角色也就授不了 -- 适用: -- 朱茏老师(user_id=223,角色含 3003-学生信息管理) -- 以及已经能打开本模块(已有管理员列表/授权查询权限)的同类角色 -- 执行后: -- 相关用户需重新登录,使权限缓存生效 -- ============================================================ -- ------------------------------------------------------------ -- A) 先查(只读,可单独执行) -- ------------------------------------------------------------ -- A1. 朱茏当前角色,以及本模块相关权限(无行=该权限没有) SELECT u.user_id, u.user_name, u.nick_name, r.role_id, r.role_name, m.menu_id, m.menu_name, m.perms FROM sys_user u JOIN sys_user_role ur ON ur.user_id = u.user_id JOIN sys_role r ON r.role_id = ur.role_id JOIN sys_role_menu rm ON rm.role_id = r.role_id JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE u.user_id = 223 AND ( m.perms LIKE 'xgStudentManager%' OR m.menu_name LIKE '%学生管理员%' ) ORDER BY m.perms, r.role_id; -- A2. 关键权限是否已具备(1=有,0=没有) SELECT p.perms, EXISTS ( SELECT 1 FROM sys_user_role ur JOIN sys_role_menu rm ON rm.role_id = ur.role_id JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE ur.user_id = 223 AND m.perms = p.perms ) AS has_perm FROM ( SELECT 'xgStudentManager:studentManager:list' AS perms UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:list' UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:query' UNION ALL SELECT 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ) p; -- A3. 库里是否已有这些菜单权限码(grantDeptAuth 无行=需要下面的修复段补菜单) SELECT menu_id, menu_name, parent_id, menu_type, perms, status, visible FROM sys_menu WHERE perms IN ( 'xgStudentManager:studentManager:list', 'xgStudentManagerSource:studentManagerSource:list', 'xgStudentManagerSource:studentManagerSource:query', 'xgStudentManagerSource:studentManagerSource:edit', 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ) OR menu_name LIKE '%学生管理员%' ORDER BY parent_id, order_num, menu_id; -- ============================================================ -- 以下为修复段:确认缺 grantDeptAuth 后再执行;先备份再改 -- ============================================================ -- ------------------------------------------------------------ -- 0) 修改前备份(带时间戳后缀,避免覆盖) -- ------------------------------------------------------------ SET @bak_suffix = DATE_FORMAT(NOW(), '%Y%m%d_%H%i%s'); SET @sql_bak_menu = CONCAT( 'CREATE TABLE IF NOT EXISTS sys_menu_bak_', @bak_suffix, ' AS SELECT * FROM sys_menu' ); PREPARE stmt_bak_menu FROM @sql_bak_menu; EXECUTE stmt_bak_menu; DEALLOCATE PREPARE stmt_bak_menu; SET @sql_bak_role_menu = CONCAT( 'CREATE TABLE IF NOT EXISTS sys_role_menu_bak_', @bak_suffix, ' AS SELECT * FROM sys_role_menu' ); PREPARE stmt_bak_role_menu FROM @sql_bak_role_menu; EXECUTE stmt_bak_role_menu; DEALLOCATE PREPARE stmt_bak_role_menu; SELECT CONCAT('sys_menu_bak_', @bak_suffix) AS menu_backup_table, CONCAT('sys_role_menu_bak_', @bak_suffix) AS role_menu_backup_table; -- ------------------------------------------------------------ -- 1) 解析父菜单(一条 SELECT,避免 Navicat 把 SET+子查询拆段) -- 优先级:授权关系列表菜单 > 其父级 > 同模块按钮父级 > 学生管理员设置 > 管理员列表父级 -- ------------------------------------------------------------ SET @parent_id = NULL; SELECT picked.menu_id INTO @parent_id FROM ( SELECT menu_id, 1 AS ord FROM sys_menu WHERE perms = 'xgStudentManagerSource:studentManagerSource:list' AND menu_type IN ('C', 'M') UNION ALL SELECT parent_id, 2 FROM sys_menu WHERE perms = 'xgStudentManagerSource:studentManagerSource:list' UNION ALL SELECT parent_id, 3 FROM sys_menu WHERE perms IN ( 'xgStudentManagerSource:studentManagerSource:query', 'xgStudentManagerSource:studentManagerSource:edit', 'xgStudentManagerSource:studentManagerSource:add' ) UNION ALL SELECT menu_id, 4 FROM sys_menu WHERE menu_name LIKE '%学生管理员设置%' AND menu_type IN ('C', 'M') UNION ALL SELECT parent_id, 5 FROM sys_menu WHERE perms = 'xgStudentManager:studentManager:list' ) picked WHERE picked.menu_id IS NOT NULL ORDER BY picked.ord, picked.menu_id LIMIT 1; SELECT @parent_id AS resolved_parent_id; -- ------------------------------------------------------------ -- 2) 新增「分配管理范围」按钮权限(若不存在,且已解析到父菜单) -- ------------------------------------------------------------ INSERT INTO sys_menu ( menu_id, menu_name, parent_id, order_num, path, component, query_param, is_frame, is_cache, menu_type, visible, status, perms, icon, create_dept, create_by, create_time, update_by, update_time, remark ) SELECT 2005461500000000003, '分配管理范围', @parent_id, 6, '', NULL, NULL, 1, 0, 'F', '0', '0', 'xgStudentManagerSource:studentManagerSource:grantDeptAuth', '', 100, 1, NOW(), 1, NOW(), '补齐自定义管理员分配管理范围接口权限,解决提交403' FROM DUAL WHERE @parent_id IS NOT NULL AND NOT EXISTS ( SELECT 1 FROM sys_menu WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ); -- 父菜单没解析到时,这条会提示,且上面的 INSERT 不会写入 SELECT CASE WHEN @parent_id IS NULL THEN '未找到父菜单,未插入按钮。请先看 A3 的菜单结果,手工指定 parent_id 后再执行第 2 步' WHEN EXISTS ( SELECT 1 FROM sys_menu WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ) THEN 'grantDeptAuth 菜单已存在(含本次新建)' ELSE '未插入,请检查 sys_menu' END AS menu_insert_result; -- ------------------------------------------------------------ -- 3) 给「学生信息管理」角色(3003)授权(朱茏已拥有该角色) -- ------------------------------------------------------------ INSERT INTO sys_role_menu (role_id, menu_id) SELECT 3003, m.menu_id FROM sys_menu m WHERE m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' AND NOT EXISTS ( SELECT 1 FROM sys_role_menu rm WHERE rm.role_id = 3003 AND rm.menu_id = m.menu_id ); -- ------------------------------------------------------------ -- 4) 兼容:已能使用本模块的角色,一并补上分配范围权限 -- 判定:已有管理员列表、授权关系查询/列表/修改,或菜单名含「学生管理员设置」 -- ------------------------------------------------------------ INSERT INTO sys_role_menu (role_id, menu_id) SELECT DISTINCT rm.role_id, grant_menu.menu_id FROM sys_role_menu rm JOIN sys_menu owned ON owned.menu_id = rm.menu_id JOIN sys_menu grant_menu ON grant_menu.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' WHERE ( owned.perms IN ( 'xgStudentManager:studentManager:list', 'xgStudentManagerSource:studentManagerSource:list', 'xgStudentManagerSource:studentManagerSource:query', 'xgStudentManagerSource:studentManagerSource:edit', 'xgStudentManagerSource:studentManagerSource:add' ) OR owned.menu_name LIKE '%学生管理员设置%' ) AND NOT EXISTS ( SELECT 1 FROM sys_role_menu x WHERE x.role_id = rm.role_id AND x.menu_id = grant_menu.menu_id ); -- ------------------------------------------------------------ -- 5) 校验:朱茏是否已具备分配范围权限 -- ------------------------------------------------------------ SELECT u.user_id, u.user_name, u.nick_name, r.role_id, r.role_name, m.menu_id, m.menu_name, m.perms FROM sys_user u JOIN sys_user_role ur ON ur.user_id = u.user_id JOIN sys_role r ON r.role_id = ur.role_id JOIN sys_role_menu rm ON rm.role_id = r.role_id JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE u.user_id = 223 AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'; -- 有行=已具备。无行时看她的角色是否在第 3/4 步的授权范围内 SELECT 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' AS perms, EXISTS ( SELECT 1 FROM sys_user_role ur JOIN sys_role_menu rm ON rm.role_id = ur.role_id JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE ur.user_id = 223 AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ) AS has_perm; -- ------------------------------------------------------------ -- 6) 复查是否执行成功(只读,可单独反复执行) -- 期望:menu_ready=1,role_3003_ready=1,zhulong_ready=1 -- ------------------------------------------------------------ SELECT EXISTS ( SELECT 1 FROM sys_menu WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' AND menu_type = 'F' AND status = '0' AND parent_id IS NOT NULL ) AS menu_ready, EXISTS ( SELECT 1 FROM sys_role_menu rm JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE rm.role_id = 3003 AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ) AS role_3003_ready, EXISTS ( SELECT 1 FROM sys_user u JOIN sys_user_role ur ON ur.user_id = u.user_id JOIN sys_role_menu rm ON rm.role_id = ur.role_id JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE u.user_id = 223 AND u.nick_name = '朱茏' AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' AND m.status = '0' ) AS zhulong_ready; -- 明细:按钮挂在哪个菜单下,哪些角色拿到了 SELECT m.menu_id, m.menu_name, m.parent_id, p.menu_name AS parent_menu_name, m.perms, m.menu_type, m.status, r.role_id, r.role_name FROM sys_menu m LEFT JOIN sys_menu p ON p.menu_id = m.parent_id LEFT JOIN sys_role_menu rm ON rm.menu_id = m.menu_id LEFT JOIN sys_role r ON r.role_id = rm.role_id WHERE m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' ORDER BY r.role_id; -- 明细:朱茏通过哪个角色拥有该权限(有行即成功) SELECT u.user_id, u.user_name, u.nick_name, r.role_id, r.role_name, m.menu_id, m.menu_name, m.perms, m.status AS menu_status FROM sys_user u JOIN sys_user_role ur ON ur.user_id = u.user_id JOIN sys_role r ON r.role_id = ur.role_id JOIN sys_role_menu rm ON rm.role_id = r.role_id JOIN sys_menu m ON m.menu_id = rm.menu_id WHERE u.user_id = 223 AND m.perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth'; -- ------------------------------------------------------------ -- 回滚示例(按需执行,把后缀换成上面查出的备份表名) -- ------------------------------------------------------------ -- DELETE FROM sys_role_menu -- WHERE menu_id IN ( -- SELECT menu_id FROM sys_menu -- WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' -- ); -- DELETE FROM sys_menu -- WHERE perms = 'xgStudentManagerSource:studentManagerSource:grantDeptAuth' -- AND menu_id = 2005461500000000003; -- -- 或整表回滚: -- -- TRUNCATE TABLE sys_role_menu; -- -- INSERT INTO sys_role_menu SELECT * FROM sys_role_menu_bak_YYYYMMDD_HHMMSS; -- -- TRUNCATE TABLE sys_menu; -- -- INSERT INTO sys_menu SELECT * FROM sys_menu_bak_YYYYMMDD_HHMMSS;