普兆健康管家后端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

5.2 KiB

小程序登录修复说明

修复的问题

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. 在控制器中获取当前用户

@GetMapping("/getCurrentUser")
public Result<AppletUser> getCurrentUser() {
    AppletUser currentUser = AppletUserUtil.getCurrentAppletUser();
    if (currentUser == null) {
        return Result.error("用户未登录");
    }
    return Result.OK("获取成功", currentUser);
}

2. 权限检查

@PostMapping("/sensitiveOperation")
public Result<String> sensitiveOperation() {
    if (!AppletUserUtil.hasPermission("applet:user:edit")) {
        return Result.error("权限不足");
    }
    // 执行敏感操作
    return Result.OK("操作成功");
}

3. 角色检查

@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 中配置:

wechat:
  mpAppId: your_applet_appid
  mpAppSecret: your_applet_secret

4. JWT配置

确保JWT工具类能正确读取配置:

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. 自动化测试: 编写完整的自动化测试用例