SSO、账号密码和短信验证码我都要-Spring Security 的认证多源登录简记

企业级SSO实战:基于Spring Security集成SAML 2.0的完整指南 单点登录(SSO)是现代企业身份管理的核心技术,旨在解决多系统登录繁琐、密码管理混乱和安全审计困难等痛点。其核心原理是通过一个集中的身份提供者(IdP)来统一认证用户,然后向各个服务提供者(SP)安全地传递认证断言,从而实现一次登录、处处访问。在技术实现上,SAML 2.0作为基于XML的开放标准协议,因其在企业级集成中的广泛支持(如与Salesforce、Office 365等SaaS服务的无缝对接),成为构建跨域、跨组织SSO体系的事实标准。对于Java技术栈,Spring Security SAML扩 阅读详情

作者:旷野说
前情提要:上回我们搞定了静默 403,这次产品又来了个新需求……


🧩 一、那个让人夜不能寐的需求

上周五下班前,产品拉住我:

“我们要支持短信验证码登录,但账号密码登录也要保留。
而且,两种方式登录后,权限、Token、审计日志……都要一样。”

我表面点头,心里打鼓。

“这不就是两个登录接口吗?”
可转念一想:如果我手动校验、手动生成 Token,那 Spring Security 的 @PreAuthorize、SecurityContext、权限决策链……不就全废了?

难道要维护两套安全逻辑?

那一刻,我意识到:

真正的挑战,不是“实现登录”,而是“如何让两种登录方式,被同一个安全体系认可”。


🔍 二、回到原点:Spring Security 的认证,到底怎么工作的?

我翻出 Spring Security 的核心接口:

public interface AuthenticationManager {
    Authentication authenticate(Authentication authentication) throws AuthenticationException;
}

所有登录,最终都调用它。

而它的默认实现是:ProviderManager。

🤔 为什么叫 “Provider” Manager?
谁是 “Provider”?它和“登录方式”有什么关系?

我画了一张草图:

[用户名/密码] → Authentication (UsernamePasswordToken)
[手机号/验证码] → Authentication (SmsCodeToken)
                      ↓
              AuthenticationManager
                      ↓
           ┌─────────┴─────────┐
           ▼                   ▼
PasswordAuthenticationProvider   SmsCodeAuthenticationProvider

✅ 原来,“Provider” 就是“认证提供者”——每种登录方式,对应一个 Provider!

而 ProviderManager 的作用,就是:根据 Token 类型,自动路由到对应的 Provider。

💡 这就是多认证源的底层逻辑:类型驱动 + 职责分离。


🧱 三、为什么需要 ProviderManager?——设计基础三问

问 1:为什么不能在一个 Provider 里 if-else 处理所有登录?

答:违反单一职责原则。
密码校验、短信校验、微信扫码……逻辑完全不同,混在一起,代码将迅速腐化。

问 2:为什么用 Authentication 子类区分,而不是用字段?

答:类型即契约。
supports(Class<?>) 方法让匹配编译期可见、运行时高效,比字符串判断(如 loginType="sms")更安全、更可扩展。

问 3:为什么需要 ProviderManager,而不是直接调用 Provider?

答:统一入口 + 异常聚合 + 扩展点。

  • 业务层只需依赖 AuthenticationManager,无需知道有多少种登录方式;
  • 失败时可尝试多个 Provider(虽不常用);
  • 未来加新登录方式,零修改现有代码。

🧩 ProviderManager 的存在,是为了“解耦认证策略”与“认证执行”。


🛠️ 四、实战:三步接入短信登录

第一步:定义专属 Token
public class SmsCodeAuthenticationToken extends AbstractAuthenticationToken {
    private final String phone;
    private final String code;

    public SmsCodeAuthenticationToken(String phone, String code) {
        super(null); // 未认证前,权限为 null
        this.phone = phone;
        this.code = code;
        setAuthenticated(false);
    }

    // 已认证构造函数(Provider 内部使用)
    public SmsCodeAuthenticationToken(UserDetails principal, Collection<? extends GrantedAuthority> authorities) {
        super(authorities);
        this.phone = principal.getUsername(); // 或单独存手机号
        this.code = null;
        setAuthenticated(true);
    }
}
第二步:实现 Provider
@Component
public class SmsCodeAuthenticationProvider implements AuthenticationProvider {

    @Override
    public boolean supports(Class<?> authentication) {
        return SmsCodeAuthenticationToken.class.isAssignableFrom(authentication);
    }

    @Override
    public Authentication authenticate(Authentication auth) {
        SmsCodeAuthenticationToken token = (SmsCodeAuthenticationToken) auth;
        // 1. 校验验证码(Redis)
        // 2. 加载用户
        // 3. 返回已认证 Token
        UserDetails user = userDetailsService.loadUserByPhone(token.getPhone());
        return new SmsCodeAuthenticationToken(user, user.getAuthorities());
    }
}
第三步:Controller 调用统一入口
@PostMapping("/login/sms")
public ResponseEntity<?> smsLogin(@RequestBody SmsLoginDto dto) {
    Authentication auth = authenticationManager.authenticate(
        new SmsCodeAuthenticationToken(dto.getPhone(), dto.getCode())
    );
    // 生成 JWT,和密码登录完全一致!
}

✅ 从此,两种登录方式,在 Spring Security 眼中“一视同仁”。


🧠 五、核心思想提炼:为什么这样设计?

Spring Security 的多认证源机制,背后是三个设计哲学:

  1. 类型即身份:不同登录方式 = 不同 Token 类型;
  2. 策略可插拔:每个 Provider 是独立策略,互不影响;
  3. 入口统一化:业务只面对 AuthenticationManager,不感知底层差异。

这正是 “面向接口编程” + “策略模式” 的经典实践。


🧵 六、终极“中诀”:多认证源三字经

认、分、统
——认证靠类型,职责要分清,入口须统一。

详解:
  • 认(认证靠类型):
    用 Authentication 子类区分登录方式,supports() 自动匹配。

  • 分(职责要分清):
    每种登录方式一个 Provider,各司其职,互不干扰。

  • 统(入口须统一):
    所有认证走 AuthenticationManager,安全上下文自动生效。

✅ 三字记心间,多源认证不再难!


✅ 七、写在最后

曾经,我把 Spring Security 当成一个“登录框架”。
现在,我明白它是一套可扩展的安全内核。

ProviderManager 不只是一个类,而是一种设计思维:

面对变化,不要 if-else,而要插件化。

当你下次需要接入微信、人脸、硬件 Key……
只需记住:

“认、分、统” —— 三字破万法。


愿你的系统,既灵活,又安全。 🔐


Spring Security实现JWT认证与安全登录接口开发 身份认证是现代Web应用的基础安全机制,其核心原理是通过验证用户凭证建立信任关系。JWT(JSON Web Token)作为主流的无状态认证方案,采用数字签名确保信息完整性,解决了传统Session的扩展性问题。在工程实践中,结合Spring Security框架可以实现包括密码加密、防暴力破解、令牌管理在内的完整安全体系。典型应用场景涵盖用户登录、API保护和微服务认证,其中多因素认证(MFA)和OAuth2集成能显著提升系统安全性。通过合理的缓存策略和性能监控,可以构建既安全又高效的认证服务。 阅读详情

相关推荐

Web身份认证全解析:从Session、JWT到SSO与安全实践

Web身份认证是解决HTTP无状态协议下用户身份识别问题的核心技术。其核心原理是通过凭证(如Session ID或Token)在客户端与服务器之间建立信任关系,使服务器能够识别请求的发起者。这项技术的价值在于保障用户数据安全、实现跨系统状态管理,并作为防御CSRF、XSS等攻击的基础防线。从经典的Session-Cookie机制到现代无状态的JWT(JSON Web Token),再到实现“一次登录,全网通行”的单点登录(SSO),认证方案随着前后端分离、微服务等架构演进不断升级。在实际应用中,开发者常需结

cmff98425的博客 416

SpringSecurity猥琐扩展短信验证码登录

项目登录框架用的是SpringSecurity,现要求扩展短信验证码模式,常规方法是实现AbstractAuthenticationProcessingFilter,AuthenticationProvider,AbstractAuthenticationToken。注意OncePasswordEncoderProxy的创建传入的被代理BCryptPasswordEncoder,你原来用的是什么就用什么,不然已有用户是无法完成密码校对的!关于AccountType,这是我封装的类。

qq_43044376的博客 1788

单点登录(sso)笔记

【1】单点登录实现方案 【2】springboot Security 【3】springSecurity 登录以及用户账号密码解析原理 【4】SpringBoot配置属性之Security 【5】Security身份认证之UserDetailsService 【6】antMatcher()和authorizeRequests().antMatchers()区别 【7】configure(HttpSecurity http) 与 configure(WebSecurity web) 【8】spring-se

shuangmu9768的博客 1万+

结合Spring Security 框架+ JWT,Java实现短信验证码、账号密码Token认证登录

本文介绍了基于Spring Security实现双因素认证(账号密码+短信验证码)的技术方案。系统采用JWT令牌进行无状态认证,关键实现包括:1)自定义安全配置类整合多种认证方式;2)SM3国密算法加密存储密码;3)SM2非对称加密保障传输安全;4)JWT过滤器实现Token校验与续期;5)异常处理机制精细化权限管控。方案通过组合AuthenticationProvider、自定义UserDetailsService和密码编码器等核心组件,构建了支持多种登录方式的安全认证体系,同时确保密码在传输和存储过程中

Mai_Jun_Hao的博客 1269

开放平台实现安全的身份认证与授权原理与实战:单点登录与会话管理

作者:禅与计算机程序设计艺术 1.背景介绍 随着互联网行业的发展,越来越多的应用开始提供服务到互联网上,在这种情况下,用户的个人信息和数据需要进行加密存储,应用也需要对访问者进行身份认证、授权和鉴权等过程。但是对于应用来说,如何保证这些信息的安全,并能够确保应用和用户之间的通信安全是一个很重要的问题

AI天才研究院 309

Unity Acceleratorc与Cache Server unity的缓存服务器

文章目录1.作用概述2.用法(使用,看这个就够了)服务端下载部署Unity Acceleratorc修改http管理端口修改Editor连接端口客户端使用(设置好一次提交设置,团队拉取即可全部生效)3.测试平台切换测试资源导入测试(打开编辑器的情况下)项目启动测试(不打开编辑器的情况下)4.不同版本表现5.服务端监控6.服务端缓存7.冲突8.预警9.不同项目/不同配置-同种资源10.缓存清除 1.作用概述 编辑器模式下,导入资源,切换平台unity都会重新识别资源,大型项目很浪费时间,使用Cache Ser

euphorias的博客 3812

Spring Security(学习笔记)--用户名密码登录与短信验证码(模拟短信)登录同时支持怎么弄?

账号密码与验证码登录怎么同时支持?

TONGZHOUGONGDU的博客 2532

手把手教你用CCS v7.3调试TI DSP28377:从连接仿真器到看懂Flash里的秘密

本文详细介绍了使用CCS v7.3调试TI DSP28377的全过程,从连接仿真器到解析Flash启动机制。通过实战演示和关键配置要点,帮助工程师快速掌握DSP调试技巧,并深入探讨bootloader设计与在线升级的实现方法,提升开发效率。

weixin_29158413的博客 408

Chatterbox 开源语音合成实战:10 秒录音克隆音色,一条命令生成 23 种语言

Chatterbox 是 Resemble AI 开源的语音合成(TTS)模型系列,pip 一条命令即可装好。给它约 10 秒的参考录音,就能用这个人的音色朗读新文本;支持 23 种以上语言,还能在句中插入 [laugh]、[cough] 等副语言标签,让声音带笑、带咳嗽。适合想搭建语音克隆、多语言配音或低延迟语音助手的开发者。 ## 🎯 Chatterbox 能帮你做什么 对普通用户和开发

gitblog_01162的博客 192

避坑指南:汇川SV660N配合SOEM时,PDO映射与CiA402状态机那些容易出错的地方

本文深入解析汇川SV660N伺服驱动与SOEM主站在PDO动态映射和CiA402状态机切换中的常见问题,提供实战代码和调试技巧。重点解决PDO配置时序、状态机转换同步等关键难点,帮助工程师避免典型错误,实现稳定通信与控制。

weixin_30653023的博客 498

Dify-前端本地运行-单点登录

本文介绍了如何在已部署Dify的系统中实现AI应用跳转及页面定制化改造。通过iframe跳转无法满足甲方需求后,作者对Dify前端源码进行了本地化二次开发,主要步骤包括:1) 按照官方文档搭建本地开发环境;2) 修改.env配置文件连接部署好的后端服务;3) 隐藏侧边栏和头部导航栏;4) 实现单点登录功能,通过URL参数获取用户邮箱自动登录。过程中解决了请求拦截导致的登录校验问题,最终达成仅保留对话框界面并同步用户信息的需求。该方案涉及Next.js框架和React技术的应用,为类似定制化需求提供了参

weixin_43163457的博客 3227

5分钟搭建企业级Spring Boot OAuth2单点登录系统:告别多账号烦恼

还在为微服务架构中的用户认证问题头疼吗?你是否遇到过员工需要记住多个系统的不同账号密码,或者开发团队在每个服务中重复实现认证逻辑的困扰?今天,我要为你介绍一个开箱即用的Spring Boot OAuth2单点登录系统,它能让你在5分钟内搭建起企业级的统一认证中心。这个基于Spring Boot 3+和Spring Security 6+的OAuth2认证系统,不仅支持完整的OAuth2协议,还提供

gitblog_00513的博客 212

锂电池主动均衡理解

锂电池主动均衡方案总结: 来自:http://wenku.baidu.com/link?url=EWiyACZ3aLPhcOjI4FZL3uQ9d0FD6dBhADQSVQiaSmRHHATTdSig1Wy39JY7-ijCzbAEYG1ymz6Lv5zhGdZaStQSHzFt6v3h3_tMrJudz9O 目前车厂采用被动均衡方案的公司:(来自网页) 目前采用主动均衡的...

weixin_34365417的博客 2911

企业级Spring Boot OAuth2单点登录系统:5分钟构建统一认证中心终极指南

在微服务架构盛行的今天,企业面临的最大挑战之一就是如何实现安全、高效的身份认证与授权管理。Spring Boot OAuth2单点登录系统提供了一个完整的企业级解决方案,帮助企业快速构建统一的认证中心。无论你是技术决策者评估认证方案,还是开发者需要集成专业SSO功能,这个开源项目都能为你提供强大的技术支撑。 ## 🏢 企业级应用场景:解决实际业务痛点 ### 场景一:微服务架构的统一认证中心

gitblog_00197的博客 123

KCP(快速可靠UDP)——用带宽换延迟的极致艺术

想象你是一个外卖平台的调度员。这就是KCP的本质——

本博客聚焦游戏开发技巧、创业实战心得及大学热门课程干货。这里既有技术深度,也有思维广度,无论你是开发者、创业者还是高校学子,都能在这里找到适合自己的成长之路! 205

Codex 100个真实案例 - 用AI生成Blender 3D建模脚本(建模师要失业了?)

本案例将展示如何用 Codex 生成 Blender Python API(bpy)脚本,自动创建完整的 3D 模型。我们将从基础几何体开始,逐步实现布尔运算、材质设置、光照配置,最终完成一张精美桌子的 3D 建模——包括桌面、桌腿、倒角、木纹材质。还会实现参数化批量生成不同风格的桌子、渲染输出 PNG 图片、以及 360 度旋转动画。全程用自然语言驱动 Codex,让建模从"点鼠标"变成"说人话"!

yueyeguzhuo的专栏 635

企业级单点登录实战:从零搭建统一认证平台

最近在公司参与了一个单点登录(SSO)系统的搭建项目,目标是解决5000多名员工需要记住多套账号密码的痛点。经过三个月的实战,我们成功实现了统一认证平台,这里分享下关键实现思路和经验总结。这个项目让我深刻体会到,好的SSO系统不仅要技术过关,更要考虑用户体验和管理便利性。比如我们增加的"一键解锁"功能,让部门主管可以自助解锁下属账号,大大减轻了IT运维压力。员工平均每天要登录5次不同系统,密码管理混乱,IT部门每年处理300+密码重置请求。,它的云开发环境可以免去本地配置的麻烦,一键部署演示项目特别方便。

BlackironPanther23的博客 165

3D iToF深度分辨率测量

本文展示了RGB-D传感器在三维测量中的高精度表现。标靶深度图显示其具备清晰、低噪、无干扰的特性,点云数据完整度高且轮廓分明。该技术已成功应用于物流(体积测量误差<1%)、工业(高反光部件装配检测)和农业(果蔬成熟度分级)等领域,验证了其硬件和算法的可靠性,能够满足不同场景下的三维测量需求。

dream it possible 253

如何快速搭建企业级Spring Boot OAuth2单点登录系统?完整实战指南

在当今微服务架构盛行的时代,统一的身份认证和授权管理变得尤为重要。Spring Boot OAuth2认证系统提供了一个完整的单点登录解决方案,能够帮助企业快速构建安全可靠的认证中心。无论你是正在寻找SSO解决方案的技术决策者,还是需要为项目集成认证功能的开发者,这个开源项目都能为你提供强大支持。 ## 🚀 5分钟快速上手:从零开始部署认证中心 ### 环境准备与项目获取 首先确保你的系统满

gitblog_00606的博客 379

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

ExplorerPatcher 完整指南:Windows 11 开始菜单磁贴消失?用它一键修复并定制整个界面

ExplorerPatcher 是一款开源的 Windows 11 系统增强工具,能把"消失"的开始菜单磁贴找回来,把任务栏换回 Windows 10 经典样式,还能深度定制界面。零基础用户几分钟即可完成安装,普通 Windows 用户开箱即用。 ## 一|能力全景:它到底能帮你做什么 与其把它当成"修复工具",不如看成一个**界面控制中心**——Windows 11 里被砍掉或改得你不喜欢的

gitblog_00375的博客 381

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

单点登录SSO设计分析

本文分析了MaxKey开源IAM系统的设计架构。系统采用模块化设计,包含认证、协议、持久化等核心模块,使用抽象工厂、策略、模板方法等多种设计模式实现认证授权功能。核心实体包括用户、应用、角色和资源,通过分层架构处理认证流程(验证凭证、创建会话等)和授权流程(权限检查、访问控制)。系统支持多种认证协议,各模块间通过接口松耦合,便于扩展新的认证方式和协议。

通达的博客 526

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

WeMod免费解锁专业版功能指南:Wand-Enhancer本地增强5分钟上手

Wand-Enhancer 是一款面向 WeMod 游戏修改器的开源本地增强工具:它在你电脑上运行,把 WeMod 的专业版(Pro)功能、手机远程面板等本地功能开关打开,无需购买会员,全程操作约 5 到 10 分钟。适合已经装好 WeMod、想把功能用满的新手。 ## 它做什么,不做什么 把 WeMod 想成一台出厂功能齐全、但部分能力被"锁住"的游戏机,Wand-Enhancer 就是一张

gitblog_01129的博客 189

Spring Security- 自定义 Oauth2 的授权服务器配置

Spring Security OAuth2 授权服务器配置指南 🚀 本文介绍了如何使用 Spring Security 构建自定义 OAuth2 授权服务器,涵盖了核心概念、技术栈准备、数据模型设计和实现流程。内容要点: OAuth2 基础:解释了 OAuth2 的四种授权模式和核心角色(资源拥有者、客户端、授权服务器、资源服务器) 自定义授权服务器的必要性:适用于需要完全控制认证流程、私有化部署或深度集成的场景 技术实现: 采用 Spring Authorization Server 模块 使用 H2

千淘万漉虽辛苦,吹尽狂沙始到金 1万+

Paperless-ngx 中文识别实战:中文 OCR、日期解析与界面汉化一次配好

HR 专员把一整箱劳动合同扫描件丢进 Paperless-ngx,想搜"劳动合同"归档,结果搜索框空空如也——因为默认的 OCR 只带英文语言包。本文带你完成三件事:Paperless-ngx 中文 OCR 配置、中文日期解析、界面汉化,全程约 15 分钟。 ## 🧩 为什么默认配置"读不懂"中文 Paperless-ngx 底层用 OCRmyPDF 驱动 Tesseract 引擎做文字识别

gitblog_00546的博客 452

SpringSecurity、Shiro、Oauth2.0、Cas

文章目录 认证和授权总流程认证技术技术选型cas基本流程首次登陆流程再次登陆流程注销流程 cas实现相关自定义登陆逻辑cas service配置cas service管理自定义用户登陆界面SpringBoot配置cas client SpringSecurity基...

m0_37695902的博客 2077
上一篇: 一个开发者对 Spring Security 拦截机制的深度追问(续)
下一篇: 一张图看懂:Spring Boot 如何处理请求?Java 21 虚拟线程又带来了什么?
旷野说
博客等级 码龄9年 361粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值