|
|
- # 小程序登录修复说明
-
- ## 修复的问题
-
- ### 1. 用户信息获取问题
- **原问题**: `AppletShiroRealm` 中的 `getAppletUser` 方法返回null,导致无法正确获取用户信息。
-
- **修复方案**:
- - 完善了 `getAppletUser` 方法,支持从数据库和Redis缓存获取用户信息
- - 添加了用户信息缓存机制,提高性能
- - 增加了异常处理和日志记录
-
- ### 2. Token验证逻辑不完整
- **原问题**: Token验证缺少黑名单检查和刷新机制。
-
- **修复方案**:
- - 添加了token黑名单检查
- - 完善了token刷新逻辑
- - 统一了token管理机制
-
- ### 3. Shiro认证体系集成问题
- **原问题**: 小程序登录没有正确集成到Shiro认证体系。
-
- **修复方案**:
- - 创建了专用的 `AppletShiroConfig` 配置类
- - 完善了 `AppletShiroRealm` 的认证和授权逻辑
- - 添加了小程序用户默认权限配置
-
- ### 4. 控制器参数验证不足
- **原问题**: 控制器缺少参数验证和错误处理。
-
- **修复方案**:
- - 添加了完整的参数验证
- - 增加了Swagger API文档注解
- - 完善了错误处理和日志记录
-
- ## 新增功能
-
- ### 1. 用户工具类
- 创建了 `AppletUserUtil` 工具类,提供以下功能:
- - `getCurrentAppletUser()`: 获取当前登录的小程序用户
- - `getCurrentAppletUserId()`: 获取当前用户ID
- - `getCurrentAppletUserOpenid()`: 获取当前用户openid
- - `isAppletUserLoggedIn()`: 检查用户是否已登录
- - `hasPermission()`: 检查用户权限
- - `hasRole()`: 检查用户角色
-
- ### 2. 缓存机制
- - 用户信息缓存(30分钟)
- - Token缓存(JWT过期时间的2倍)
- - Session_key缓存(7天)
- - 手机号临时缓存(5分钟)
- - Token黑名单缓存(24小时)
-
- ### 3. 权限控制
- - 小程序用户默认角色:`applet_user`
- - 小程序用户默认权限:`applet:user:*`
- - 支持细粒度权限控制
-
- ## 使用示例
-
- ### 1. 在控制器中获取当前用户
- ```java
- @GetMapping("/getCurrentUser")
- public Result<AppletUser> getCurrentUser() {
- AppletUser currentUser = AppletUserUtil.getCurrentAppletUser();
- if (currentUser == null) {
- return Result.error("用户未登录");
- }
- return Result.OK("获取成功", currentUser);
- }
- ```
-
- ### 2. 权限检查
- ```java
- @PostMapping("/sensitiveOperation")
- public Result<String> sensitiveOperation() {
- if (!AppletUserUtil.hasPermission("applet:user:edit")) {
- return Result.error("权限不足");
- }
- // 执行敏感操作
- return Result.OK("操作成功");
- }
- ```
-
- ### 3. 角色检查
- ```java
- @GetMapping("/adminOnly")
- public Result<String> adminOnly() {
- if (!AppletUserUtil.hasRole("applet_admin")) {
- return Result.error("需要管理员权限");
- }
- return Result.OK("管理员操作成功");
- }
- ```
-
- ## 配置要求
-
- ### 1. 数据库配置
- 确保 `applet_user` 表已创建,包含以下字段:
- - `id`: 主键
- - `openid`: 微信openid(唯一索引)
- - `phone`: 手机号(唯一索引)
- - `name`: 用户昵称
- - `avatar`: 头像
- - `bmi`: 体总指数
- - `fat`: 脂肪
- - `create_time`: 创建时间
- - `update_time`: 更新时间
-
- ### 2. Redis配置
- 确保Redis服务正常运行,用于缓存:
- - 用户信息
- - Token缓存
- - Session_key
- - 黑名单
-
- ### 3. 微信配置
- 在 `application.yml` 中配置:
- ```yaml
- wechat:
- mpAppId: your_applet_appid
- mpAppSecret: your_applet_secret
- ```
-
- ### 4. JWT配置
- 确保JWT工具类能正确读取配置:
- ```yaml
- jeecg:
- jwt:
- secret: your_jwt_secret_key
- expire: 604800
- ```
-
- ## 安全改进
-
- ### 1. Token安全
- - 生产环境不返回session_key
- - Token自动刷新机制
- - Token黑名单管理
- - 支持token主动失效
-
- ### 2. 参数验证
- - 所有接口都添加了参数验证
- - 防止空参数和恶意参数
- - 统一的错误处理
-
- ### 3. 权限控制
- - 基于Shiro的权限控制
- - 支持角色和权限检查
- - 细粒度权限管理
-
- ## 性能优化
-
- ### 1. 缓存策略
- - 用户信息缓存减少数据库查询
- - Token缓存提高验证速度
- - 合理的缓存过期时间
-
- ### 2. 异常处理
- - 完善的异常捕获和处理
- - 详细的日志记录
- - 友好的错误提示
-
- ### 3. 并发处理
- - 线程安全的用户信息获取
- - 原子性的token操作
- - 避免并发冲突
-
- ## 测试建议
-
- ### 1. 功能测试
- - 测试完整的登录流程
- - 测试token刷新机制
- - 测试权限控制功能
- - 测试异常情况处理
-
- ### 2. 性能测试
- - 测试高并发登录
- - 测试缓存命中率
- - 测试数据库连接池
-
- ### 3. 安全测试
- - 测试token伪造防护
- - 测试权限绕过防护
- - 测试参数注入防护
-
- ## 注意事项
-
- 1. **生产环境配置**: 确保生产环境使用HTTPS,不要暴露敏感信息
- 2. **日志管理**: 合理配置日志级别,避免敏感信息泄露
- 3. **监控告警**: 添加关键操作的监控和告警
- 4. **备份策略**: 定期备份用户数据和配置信息
- 5. **版本兼容**: 注意API版本兼容性,避免影响现有客户端
-
- ## 后续优化建议
-
- 1. **多租户支持**: 如果需要支持多租户,可以扩展用户表结构
- 2. **第三方登录**: 可以扩展支持其他第三方登录方式
- 3. **消息推送**: 集成消息推送功能,支持实时通知
- 4. **数据分析**: 添加用户行为分析功能
- 5. **自动化测试**: 编写完整的自动化测试用例
|