xinli/问卷权限问题修复说明.md

133 lines
4.0 KiB
Markdown
Raw Normal View History

2025-12-02 15:12:55 +08:00
# 问卷权限问题修复说明
## 问题描述
用户反馈:问卷明明没有设置权限,但用户却能够查看。
## 问题根源
在权限系统中存在一个**"所有用户"权限机制**
### 权限查询逻辑(`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不受权限限制始终可以看到所有量表/问卷