应先明确平台角色:建认证中心需用Keycloak或Spring Authorization Server,接认证中心则用spring-security-oauth2-client四步接入,注意issuer-uri、registration-id唯一性、双向登出及避免Session共享实现SSO。

明确平台角色:先决定你是建认证中心还是接认证中心
统一身份认证平台不是单个 Spring Boot 应用“集成 OAuth2”就能实现的,它由两部分构成:授权服务器(认证中心) 和 OAuth2 客户端(业务系统)。你得先选清楚自己要做什么:
- 如果目标是搭建企业级统一登录入口(比如所有系统都跳转到 /login 页面,账号密码只在一处管理),那你需要构建一个 OAuth2 授权服务器 —— 这是认证中心本身,要用
spring-security-oauth2-authorization-server(Spring Security 6.2+ 推荐)或 Keycloak 等成熟方案,而不是单纯“集成客户端依赖”。 - 如果你已有认证中心(如公司已部署 Keycloak、Auth0 或自研 OAuth2 Server),当前项目只是后台管理、数据看板这类业务系统,那才是标准的 OAuth2 客户端接入,用
spring-security-oauth2-client即可。
作为客户端接入:四步走清链路,不靠黑盒自动配置
以 Spring Boot 3.3 + Spring Security 6 为例,客户端接入不是加个依赖就完事,关键在理解并控制这四个环节:
-
拦截未认证请求:Spring Security 默认会把未登录访问重定向到
/oauth2/authorization/{registration-id},比如/oauth2/authorization/keycloak。你要确认这个路径是否暴露、是否被其他过滤器干扰。 -
接收授权码回调:认证中心登录成功后,必须重定向回你的
redirect-uri,例如http://localhost:8080/login/oauth2/code/keycloak。这个地址必须和你在认证中心注册的完全一致,大小写、斜杠都不能错。 -
后台换 token 并拉用户信息:客户端收到 code 后,会自动向认证中心的
/token端点发起 POST 请求换 access_token,再调/userinfo(OIDC)或/user/me(OAuth2)获取用户资料。确保你的 client-secret 配置正确,且认证中心允许该 client 使用授权码模式。 -
本地建立安全上下文:拿到用户信息后,Spring Security 会封装成
OidcUser或OAuth2User,放进SecurityContext。你可以通过@AuthenticationPrincipal注入使用,也可以自定义OAuth2UserService把用户存进本地数据库(如按 subject 或 email 创建 User 实体)。
作为认证中心搭建:别从零手写,优先用标准化方案
自己实现完整 OAuth2 授权服务器复杂度高、安全风险大,2026 年主流做法是:
- 直接部署 Keycloak:开源、支持 OIDC、提供管理控制台、内置 LDAP/AD 集成、支持多租户,Docker 一条命令即可启动,Spring Boot 客户端只需配好 issuer-uri 就能对接。
-
用 Spring Authorization Server:如果你坚持 Java 技术栈闭环,选用官方维护的
spring-authorization-server(非旧版spring-security-oauth)。它基于 Spring Security 5.7+ 重构,专注授权服务器能力,支持 JWT 签发、JWK 密钥管理、PKCE 等现代特性。 - 云服务替代方案:Auth0、Amazon Cognito、阿里云 IDaaS 等,省去运维成本,天然支持社交登录、MFA、风控策略,适合中大型企业快速上线。
关键配置与避坑点
无论做客户端还是中心,这几个细节容易出问题:
立即学习“Java免费学习笔记(深入)”;
-
issuer-uri 必须带协议和端口:比如
https://auth.example.com,不能只写auth.example.com,否则客户端解析 JWKS URI 会失败。 - client-registration 中 registration-id 要全局唯一:它不仅是配置名,还会生成默认 redirect-uri 路径,多个 client 别重复。
-
登出逻辑要双向清理:客户端调
SecurityContextLogoutHandler清本地 Session,同时需主动调用认证中心的 end_session_endpoint(OIDC)完成全局登出,否则用户在别处仍处于登录态。 - 不要共享 Session 实现 SSO:SSO 的本质是信任同一个认证源,不是把 HttpSession 复制到各服务。每个业务系统维护自己的 Session,只在登录时统一走认证中心校验。


















