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

133 lines
4.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 问卷权限问题修复说明
## 问题描述
用户反馈:问卷明明没有设置权限,但用户却能够查看。
## 问题根源
在权限系统中存在一个**"所有用户"权限机制**
### 权限查询逻辑(`PsyScalePermissionMapper.xml`
```sql
-- 或者所有用户权限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` 都为空,那么所有用户都能看到这个量表/问卷!**
### 问题产生原因
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查看当前存在的"所有用户"权限:
```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';
```
2. 如果发现不需要的"所有用户"权限,可以:
- 在权限管理页面找到该记录(显示"所有用户"标签),点击删除
- 或直接在数据库中删除/禁用
## 如何清理不需要的权限
### 方法1通过管理界面
1. 进入 **心理测评管理****量表权限管理**
2. 找到显示"所有用户"标签的权限记录
3. 点击"删除"按钮
### 方法2通过SQL
```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不受权限限制始终可以看到所有量表/问卷