Haorong Mall 登录实现分析
本文档详细分析了 haorong-mall 项目中 B 端(ToB)和 C 端(ToC)的登录实现机制。
1. 核心差异概览
| 特性 | ToB (B端 - 管理后台) | ToC (C端 - 商城小程序/APP) |
|---|---|---|
| 主要用户 | 系统管理员、运营人员、商户 | 普通消费者 (Shoppers) |
| 入口控制器 | TobTokenController | TocTokenController |
| 核心服务 | LoginService | TocLoginService |
| 用户表 | sys_user (系统用户) | user_info (商城用户), wx_user (微信用户) |
| 鉴权设备标识 | DeviceTypeEnum.TOB | DeviceTypeEnum.TOC |
| 多租户处理 | 登录后确定租户上下文 | 登录时绑定/获取租户信息 |
2. ToB 登录实现 (管理后台)
ToB 登录主要服务于后台管理系统,支持账号密码登录和手机短信验证码登录。
2.1 核心类
- Controller:
com.haorong.cloud.auth.controller.TobTokenController - Service:
com.haorong.cloud.auth.service.LoginService - Filter:
com.haorong.cloud.auth.filter.SmsValidateCodeFilter(负责短信验证码校验)
2.2 登录流程
A. 账号密码登录 (/token/login)
- 接收参数:
username,password(加密后)。 - 解密密码:使用 AES 解密前端传输的密码。
- 查询用户:调用
RemoteSysUserService根据用户名查询SysUser。 - 校验逻辑:
- 检查用户是否存在。
- 校验 MD5 密码是否匹配。
- 检查用户状态(是否被禁用)。
- 生成 Token:
- 调用
SecurityUtils.loginByDevice(hxUser, DeviceTypeEnum.TOB)。 - Sa-Token 生成 Token 并返回。
- 调用
- 日志记录:记录登录成功/失败日志 (
sys_login_log)。
B. 短信验证码登录 (/token/sms/login)
- 前置校验:请求进入 Controller 前,先经过
SmsValidateCodeFilter。- 过滤器从 Redis (
sms:code:{phone}) 获取验证码并比对。 - 校验通过后放行。
- 过滤器从 Redis (
- 业务逻辑:
- 调用
LoginService.smsLogin(phone)。 - 根据手机号查询
SysUser。 - 执行用户存在性与状态检查。
- 生成 Token (Device=TOB)。
- 调用
3. ToC 登录实现 (商城端)
ToC 登录逻辑更为复杂,涉及微信生态(小程序)与自营账号体系的绑定。
3.1 核心类
- Controller:
com.haorong.cloud.auth.controller.TocTokenController - Service:
com.haorong.cloud.auth.service.TocLoginService - Remote Service:
RemoteWeiXinUserService(微信用户),RemoteMallUserService(商城用户)
3.2 核心模式:账号绑定
C 端系统的核心在于 微信用户 (WxUser) 与 商城用户 (UserInfo) 的绑定关系。
- 无感知登录:如果微信用户已绑定商城用户,小程序在登录时可直接自动登录。
- 注册/绑定:如果未绑定,通常需要用户授权手机号,系统自动创建/关联商城用户。
3.3 登录流程
A. 小程序静默登录 (/toc-token/ma/login)
- 前端调用:传入
jsCode。 - 微信交互:后端调用微信接口换取
OpenId/SessionKey。 - 绑定检查:
- 如果该微信用户 (
WxUser) 已绑定mallUserId-> 直接生成 Token (登录成功)。 - 如果 未绑定 -> 返回微信用户 ID,前端跳转至手机号绑定/登录页。
- 如果该微信用户 (
B. 小程序手机号一键登录 (/toc-token/ma/phone/login)
- 前端调用:传入微信加密的手机号数据 (
code/encryptedData)。 - 解密手机号:调用微信接口获取真实手机号。
- 用户查询/创建:
- 根据手机号查询
UserInfo。 - 如果不存在,则自动注册新用户。
- 根据手机号查询
- 建立绑定:将当前的微信用户 (
WxUser) 与该手机号对应的商城用户 (UserInfo) 绑定。 - 生成 Token:登录成功,返回 Token。
C. 短信/密码登录
- 短信登录 (
/toc-token/sms/login):类似 ToB 短信登录,但增加了“若微信 ID 存在则尝试绑定”的逻辑。 - 密码登录 (
/toc-token/password/login):传统的手机号+密码登录,同样包含自动绑定微信账号的逻辑。
4. 通用安全机制
4.1 Sa-Token 多端隔离
系统使用 Sa-Token 的 loginByDevice 方法区分不同端的登录态:
- ToB:Token 仅在后台管理相关接口有效。
- ToC:Token 仅在商城业务相关接口有效。 这防止了 C 端用户利用 Token 访问管理后台接口,反之亦然。
4.2 验证码安全
SmsValidateCodeFilter 统一拦截特定路径(如 */sms/login),确保在进入业务逻辑前验证码已被校验且从 Redis 中清除(防止重放攻击)。