首页 / 业务功能与流程 / 认证与登录流程

认证主体与体系

主体认证体系Token
APP 会员 member_user短信/邮箱验证码、社交账号、微信小程序登录;TOTP 双因子JWT(auth:token:{userID}
后台管理员 system_users账号密码 + OAuth 授权;后台高风险操作强制 MFAJWT
Go 内部服务网关注入身份(goauth 代理认证)+ 内部签名(HMAC)透传 Header / Metadata
设备设备密钥/证书(dgsvr 登录认证 + 访问认证)MQTT 会话 + 状态

APP 登录流程

  1. 用户提交登录凭据(MemberAuthServiceImpl.smsLogin / emailCodeLogin / socialLogin / weixinMiniAppLogin
  2. 校验验证码/社交绑定;通过后查询/创建会员并生成 JWT 令牌
  3. Token 写入 Redis(auth:token:{userID}),响应返回访问令牌与刷新令牌
  4. 登录成功后更新登录信息(updateUserLogin(userId, clientIP))并记录登录日志
  5. 开启 TOTP 的用户按 MemberTotpAuthService 二次校验(MFA)

服务端过滤链:TokenAuthenticationFilter 从请求解析 JWT → 构建 LoginUser 上下文(SecurityFrameworkUtils)→ Controller 用 @PreAuthorize 校验权限。

后台登录与 MFA

  • 后台登录走 system AuthController(OAuth 授权码/密码模式),主体为 system_users
  • RBAC 权限:菜单/按钮级权限由角色关联,接口以 @PreAuthorize 权限标识为契约。
  • MFA:后台管理员与高风险操作(远程格式化存储卡、修改固件参数)必须启用 TOTP;MemberTotpController 管理密钥与恢复码。
  • 暴力破解防御:登录接口速率限制 + 连续失败锁定(合规规则要求)。

Go 网关鉴权

Java 与 Go 之间的身份采用代理认证(framework security/goauth):

  1. 客户端先经 Java 业务面认证,获得 JWT
  2. Java 侧通过 GoProxyAuthenticationException / LoginUserRequestInterceptor 将身份注入 RPC Metadata
  3. Go 拦截器校验 User-ID / Tenant-ID / Region 并做数据隔离判定
  4. 内部服务间调用使用 EntraxInternalSignatureService(HMAC 签名)校验请求来源
跨语言调用必须透传 Trace-IdUser-ID & Tenant-IDRegion;缺失可能导致鉴权/隔离拒绝。

WebSocket 握手鉴权

实时位置通道由 Java 统一鉴权后再代理到 Go wssvr:

  1. 客户端 WebSocket 握手先到达 Java(IoT 模块)
  2. RealtimeHandshakeAuthInterceptor 校验登录用户与设备资源权限,把设备名/产品/设备 ID/租户写入会话属性(不信任客户端 Header)
  3. RealtimeWebSocketProxyHandler 通过服务发现解析固定 Go 实例,携带内部签名(密钥 ≥32 字符、TTL ≤30 秒)建立上游连接
  4. Go wssvr 校验签名与上下文;鉴权或关键依赖不可用时 fail-closed 拒绝连接

设备认证

环节实现说明
登录认证dgsvr loginAuthLogic设备密钥/证书验证,建立 MQTT 会话
访问认证dgsvr accessAuthLogic会话级访问凭证校验,控制收发权限
设备注册dgsvr deviceRegisterLogic新设备入网登记(产品/密钥绑定)
上线通知NATS device.up.status.connected认证通过后推送,供 Java 消费
设备"已连接"与"已认证"是两个状态:连接由 EMQX 建立,认证通过后才允许收发业务消息。