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)不受权限限制,始终可以看到所有量表/问卷
|