4.0 KiB
4.0 KiB
问卷权限问题修复说明
问题描述
用户反馈:问卷明明没有设置权限,但用户却能够查看。
问题根源
在权限系统中存在一个**"所有用户"权限机制**:
权限查询逻辑(PsyScalePermissionMapper.xml)
-- 或者所有用户权限(user_id, role_id, dept_id 都为空)
or (p.user_id is null and p.role_id is null and p.dept_id is null)
这意味着:如果在 psy_scale_permission 表中存在一条记录,其 user_id、role_id、dept_id 都为空,那么所有用户都能看到这个量表/问卷!
问题产生原因
- 当在权限管理页面新增权限时,如果不选择任何用户(留空),系统会创建一条
user_id = null的记录 - 这条记录会被解释为"所有用户都有权限"
- 在权限列表中,这种记录会显示为"所有用户"标签,但之前不够明显
修复内容
1. 前端权限管理页面优化
修改文件:xinli-ui/src/views/psychology/permission/index.vue
改进内容:
-
列表显示优化
- 列名从"用户名称"改为"授权范围"
- "所有用户"权限使用醒目的橙色警告标签显示
- 显示"所有用户都可访问"的提示文字
-
新增筛选功能
- 添加"授权范围"筛选下拉框
- 可以快速筛选"所有用户"或"指定用户"权限
-
添加明确的"所有用户"开关
- 新增权限时有"授权范围"选项,可以选择"所有用户"或"指定用户"
- 启用"所有用户"时会显示警告提示
-
强制用户选择
- 如果不启用"所有用户"开关,必须选择至少一个用户
- 防止意外创建"所有用户"权限
-
二次确认
- 选择"所有用户"时会弹出确认框,提醒用户这将使所有人都能看到该量表/问卷
2. 数据库检查脚本
创建文件:检查和清理所有用户权限.sql
提供SQL脚本用于:
- 查看所有"所有用户"权限记录
- 统计"所有用户"权限数量
- 禁用或删除"所有用户"权限
如何检查现有数据
- 运行以下SQL查看当前存在的"所有用户"权限:
SELECT
p.permission_id,
p.scale_id,
CASE
WHEN p.scale_id < 0 THEN (SELECT questionnaire_name FROM psy_questionnaire WHERE questionnaire_id = -p.scale_id)
ELSE (SELECT scale_name FROM psy_scale WHERE scale_id = p.scale_id)
END AS scale_name,
CASE
WHEN p.scale_id < 0 THEN '问卷'
ELSE '量表'
END AS type,
p.status
FROM psy_scale_permission p
WHERE p.user_id IS NULL
AND p.role_id IS NULL
AND p.dept_id IS NULL
AND p.status = '0';
- 如果发现不需要的"所有用户"权限,可以:
- 在权限管理页面找到该记录(显示"所有用户"标签),点击删除
- 或直接在数据库中删除/禁用
如何清理不需要的权限
方法1:通过管理界面
- 进入 心理测评管理 → 量表权限管理
- 找到显示"所有用户"标签的权限记录
- 点击"删除"按钮
方法2:通过SQL
-- 禁用所有"所有用户"权限
UPDATE psy_scale_permission
SET status = '1', update_time = NOW()
WHERE user_id IS NULL
AND role_id IS NULL
AND dept_id IS NULL
AND status = '0';
-- 或者直接删除
DELETE FROM psy_scale_permission
WHERE user_id IS NULL
AND role_id IS NULL
AND dept_id IS NULL;
权限优先级说明
系统权限检查顺序:
- 用户直接权限:
user_id = 当前用户ID - 角色权限:
role_id = 用户的角色ID - 部门权限:
dept_id = 用户的部门ID - 全局权限:
user_id,role_id,dept_id都为空(所有用户)
只要满足任意一个条件,用户就能看到该量表/问卷。
注意事项
- 修改后,新增权限时必须明确选择"所有用户"或指定具体用户
- 建议检查现有数据,清理不需要的"所有用户"权限
- 管理员角色(admin)不受权限限制,始终可以看到所有量表/问卷