xinli/最终权限修复说明.md

284 lines
7.1 KiB
Markdown
Raw Normal View History

2025-12-02 15:12:55 +08:00
# 🔧 最终权限修复说明
## 📋 明确的需求
**用户需求**:无论任何时候,用户只能显示被分配权限的量表或问卷。
## ✅ 已完成的修复
### 1. 统一的权限逻辑
**简化后的逻辑**
```java
// 用户只能看到分配给自己的量表和问卷
if (scaleId != null && allowedScaleIds.contains(scaleId))
{
filtered.add(scale); // 有权限,添加
}
// 没有权限的,直接跳过
```
**特殊情况**
- **管理员**userId=1 或有管理权限):看到所有内容
- **普通用户**:只看到分配给自己的内容
### 2. 修改的文件
1. **PsyScaleController.java**
- `filterScaleListByPermission()` - 简化为单一判断
- `resolveAllowedScaleIdsForCurrentUser()` - 添加日志输出
2. **PsyQuestionnaireController.java**
- `filterQuestionnaireListByPermission()` - 简化为单一判断
- `resolveAllowedScaleIdsForCurrentUser()` - 添加日志输出
### 3. 添加的调试日志
```java
// 会输出以下日志:
logger.info("用户 userId={} 的权限列表: {}", currentUserId, scaleIds);
logger.info("权限过滤结果: 总数={}, 过滤后={}, 用户权限数={}", ...);
logger.debug("权限过滤: 允许访问 scaleId={}, scaleName={}", ...);
logger.debug("权限过滤: 拒绝访问 scaleId={}, scaleName={}", ...);
```
## 🔍 排查"不能正常显示"的问题
### 可能的原因
#### 原因 1: 权限数据不正确
**问题**:数据库中的权限记录可能有问题
**检查方法**
```sql
-- 查看用户的权限列表
SELECT * FROM psy_scale_permission
WHERE user_id = 你的用户ID AND status = '0';
```
**注意事项**
- 量表使用**正数ID**1, 2, 3
- 问卷使用**负数ID**(如:-1, -2, -3
#### 原因 2: 用户没有被分配权限
**问题**:用户在权限表中没有记录
**解决方法**:为用户分配权限
```sql
-- 为用户ID=2分配量表ID=1的权限
INSERT INTO psy_scale_permission (user_id, scale_id, status, create_by, create_time)
VALUES (2, 1, '0', 'admin', NOW());
-- 为用户ID=2分配问卷ID=1的权限注意使用负数
INSERT INTO psy_scale_permission (user_id, scale_id, status, create_by, create_time)
VALUES (2, -1, '0', 'admin', NOW());
```
#### 原因 3: ID映射错误
**问题**前端显示的问卷在权限表中没有对应的负数ID
**检查方法**
```sql
-- 检查问卷ID和权限表中的ID是否匹配
SELECT
q.questionnaire_id,
q.questionnaire_name,
-q.questionnaire_id as 权限表应该用的ID,
p.scale_id as 权限表实际的ID
FROM psy_questionnaire q
LEFT JOIN psy_scale_permission p ON -q.questionnaire_id = p.scale_id
WHERE p.user_id = 你的用户ID;
```
#### 原因 4: 用户被识别为管理员
**问题**用户ID=1 或有 `psychology:scale:list` 权限,导致看到所有内容
**检查方法**
```sql
-- 检查用户ID
SELECT user_id FROM sys_user WHERE user_name = '你的用户名';
-- 检查用户权限
SELECT r.role_name, m.perms
FROM sys_user u
INNER JOIN sys_user_role ur ON u.user_id = ur.user_id
INNER JOIN sys_role r ON ur.role_id = r.role_id
LEFT JOIN sys_role_menu rm ON r.role_id = rm.role_id
LEFT JOIN sys_menu m ON rm.menu_id = m.menu_id
WHERE u.user_name = '你的用户名';
```
## 📝 使用提供的工具
### 1. SQL检查脚本
运行 `检查权限数据.sql` 中的查询:
```sql
-- 1. 查看用户权限数量
SELECT u.user_id, u.user_name, COUNT(*) FROM ...
-- 2. 查看用户的详细权限
SELECT * FROM psy_scale_permission WHERE user_id = X ...
-- 3. 查看量表权限分配情况
SELECT s.scale_id, s.scale_name, COUNT(*) FROM ...
-- 10. 快速诊断
WITH user_permissions AS (...) ...
```
### 2. 后端日志
重新编译部署后,查看日志文件:
```bash
# 查找权限相关日志
tail -f logs/xinli.log | grep "权限"
# 应该看到类似输出:
# 用户 userId=2 的权限列表: [1, 3, -1, -2]
# 权限过滤结果: 总数=10, 过滤后=4, 用户权限数=4
```
## 🚀 部署步骤
### 1. 重新编译后端
```bash
cd c:\Users\Administrator\Desktop\Project\xinli
mvn clean package -DskipTests
```
### 2. 备份当前jar
```bash
# 备份当前运行的jar文件
copy ry-xinli-admin\target\ry-xinli-admin.jar ry-xinli-admin.jar.backup
```
### 3. 停止服务
```bash
# 根据你的部署方式停止服务
# systemctl stop xinli
# 或手动kill进程
```
### 4. 替换jar文件
```bash
# 将新编译的jar复制到部署目录
```
### 5. 启动服务
```bash
# 启动新服务
# systemctl start xinli
```
### 6. 查看日志
```bash
# 检查启动日志
tail -f logs/xinli.log
```
## 🧪 测试验证
### 测试步骤
1. **清除浏览器缓存**
- 按 Ctrl+Shift+Delete
- 清除所有缓存和Cookie
2. **使用普通用户登录**
- 不要使用admin或管理员账号
3. **查看问卷/量表列表**
- 记录看到的数量
4. **对比数据库**
- 运行SQL检查脚本
- 对比数量是否一致
### 预期结果
假设:
- 数据库中有 10 个量表、8 个问卷
- 用户被分配了 3 个量表、2 个问卷的权限
**应该看到**
- 量表列表3 个
- 问卷列表2 个
- 合计列表包含问卷5 个
## ❓ 常见问题
### Q1: 管理员看不到所有内容?
**A**: 检查用户ID是否为1或是否有管理权限
```sql
SELECT user_id FROM sys_user WHERE user_name = 'admin';
```
### Q2: 普通用户看到所有内容?
**A**: 可能被误判为管理员,检查权限配置
### Q3: 用户看不到任何内容?
**A**: 检查权限表中是否有该用户的记录
```sql
SELECT COUNT(*) FROM psy_scale_permission
WHERE user_id = X AND status = '0';
```
### Q4: 数量不一致?
**A**:
1. 检查前端是否缓存
2. 检查后端日志中的过滤数量
3. 对比数据库中的实际权限数
## 📊 数据一致性检查清单
- [ ] 权限表中的 scale_id 正确(量表用正数,问卷用负数)
- [ ] 用户有对应的权限记录
- [ ] 权限记录的 status = '0'(启用状态)
- [ ] 量表/问卷确实存在(没有孤立的权限记录)
- [ ] 用户不是管理员(除非确实需要看所有内容)
## 🎯 快速诊断命令
```sql
-- 一键诊断用户权限(替换 USER_ID
WITH user_info AS (
SELECT
2 as uid, -- 替换为实际用户ID
(SELECT COUNT(*) FROM psy_scale_permission WHERE user_id = 2 AND status = '0') as perm_count
),
expected AS (
SELECT
COUNT(DISTINCT s.scale_id) as scale_count,
COUNT(DISTINCT q.questionnaire_id) as quest_count
FROM user_info ui
CROSS JOIN psy_scale s
INNER JOIN psy_scale_permission p1 ON s.scale_id = p1.scale_id AND p1.user_id = ui.uid
CROSS JOIN psy_questionnaire q
INNER JOIN psy_scale_permission p2 ON -q.questionnaire_id = p2.scale_id AND p2.user_id = ui.uid
)
SELECT
ui.uid as 用户ID,
ui.perm_count as 总权限数,
e.scale_count as 应看到量表数,
e.quest_count as 应看到问卷数,
(e.scale_count + e.quest_count) as 应看到总数
FROM user_info ui, expected e;
```
---
**修复完成时间**2024年12月2日
**版本**v3.0 - 最终简化版
**下一步**:重新编译部署 + 使用SQL脚本检查数据