1. 项目背景与核心痛点
在开发多端应用系统时,登录模块往往是最先接触但最后被重视的功能。随着业务发展,一个系统可能同时存在:
- 后台管理系统(PC端)
- 微信小程序/H5移动端
- APP客户端
- 第三方平台接入
每个端都有不同的认证方式:
- 账号密码登录
- 短信验证码登录
- 微信开放平台登录
- 企业微信SSO登录
- 钉钉扫码登录
传统实现方式通常会出现:
- 不同登录方式散落在各个Controller中
- 重复的校验逻辑遍布每个方法
- 新增登录方式需要修改核心业务代码
- 登录日志、风控逻辑难以统一管理
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 设计思路与架构选型
2.1 工厂模式+策略模式组合拳
采用经典设计模式组合解决上述问题:
- 工厂模式:统一创建各种登录策略实例
- 策略模式:将每种登录算法封装成独立策略类
java复制// 策略接口定义
public interface LoginStrategy {
LoginResult authenticate(LoginDTO dto);
}
// 具体策略实现示例
@Service
public class PasswordLoginStrategy implements LoginStrategy {
@Override
public LoginResult authenticate(LoginDTO dto) {
// 账号密码验证逻辑
}
}
2.2 SpringBoot自动化配置
利用Spring特性实现零配置策略发现:
- 所有策略实现类标注
@Service - 工厂类自动收集所有策略Bean
- 通过
@PostConstruct初始化策略映射表
java复制@Service
public class LoginStrategyFactory {
private Map<LoginTypeEnum, LoginStrategy> strategyMap = new EnumMap<>(LoginTypeEnum.class);
@Autowired
private void initStrategies(List<LoginStrategy> strategies) {
strategies.forEach(strategy -> {
if (strategy instanceof PasswordLoginStrategy) {
strategyMap.put(LoginTypeEnum.PASSWORD, strategy);
}
// 其他策略注册...
});
}
}
3. 核心实现细节
3.1 统一登录入口设计
java复制@RestController
@RequestMapping("/auth")
public class AuthController {
@PostMapping("/login")
public Result<LoginVO> login(@RequestBody LoginDTO dto) {
// 1. 参数基础校验
// 2. 获取对应策略
LoginStrategy strategy = factory.getStra
