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