xinli/问卷权限问题修复说明.md
2025-12-02 15:12:55 +08:00

4.0 KiB
Raw Blame History

问卷权限问题修复说明

问题描述

用户反馈:问卷明明没有设置权限,但用户却能够查看。

问题根源

在权限系统中存在一个**"所有用户"权限机制**

权限查询逻辑(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_idrole_iddept_id 都为空,那么所有用户都能看到这个量表/问卷!

问题产生原因

  1. 当在权限管理页面新增权限时,如果不选择任何用户(留空),系统会创建一条 user_id = null 的记录
  2. 这条记录会被解释为"所有用户都有权限"
  3. 在权限列表中,这种记录会显示为"所有用户"标签,但之前不够明显

修复内容

1. 前端权限管理页面优化

修改文件:xinli-ui/src/views/psychology/permission/index.vue

改进内容:

  1. 列表显示优化

    • 列名从"用户名称"改为"授权范围"
    • "所有用户"权限使用醒目的橙色警告标签显示
    • 显示"所有用户都可访问"的提示文字
  2. 新增筛选功能

    • 添加"授权范围"筛选下拉框
    • 可以快速筛选"所有用户"或"指定用户"权限
  3. 添加明确的"所有用户"开关

    • 新增权限时有"授权范围"选项,可以选择"所有用户"或"指定用户"
    • 启用"所有用户"时会显示警告提示
  4. 强制用户选择

    • 如果不启用"所有用户"开关,必须选择至少一个用户
    • 防止意外创建"所有用户"权限
  5. 二次确认

    • 选择"所有用户"时会弹出确认框,提醒用户这将使所有人都能看到该量表/问卷

2. 数据库检查脚本

创建文件:检查和清理所有用户权限.sql

提供SQL脚本用于

  • 查看所有"所有用户"权限记录
  • 统计"所有用户"权限数量
  • 禁用或删除"所有用户"权限

如何检查现有数据

  1. 运行以下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. 如果发现不需要的"所有用户"权限,可以:
    • 在权限管理页面找到该记录(显示"所有用户"标签),点击删除
    • 或直接在数据库中删除/禁用

如何清理不需要的权限

方法1通过管理界面

  1. 进入 心理测评管理量表权限管理
  2. 找到显示"所有用户"标签的权限记录
  3. 点击"删除"按钮

方法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;

权限优先级说明

系统权限检查顺序:

  1. 用户直接权限: user_id = 当前用户ID
  2. 角色权限: role_id = 用户的角色ID
  3. 部门权限: dept_id = 用户的部门ID
  4. 全局权限: user_id, role_id, dept_id 都为空(所有用户)

只要满足任意一个条件,用户就能看到该量表/问卷。

注意事项

  1. 修改后,新增权限时必须明确选择"所有用户"或指定具体用户
  2. 建议检查现有数据,清理不需要的"所有用户"权限
  3. 管理员角色admin不受权限限制始终可以看到所有量表/问卷