【序列晋升】47 Spring Authorization Server授权码模式深度解构:OAuth2.1协议与PKCE扩展的实现细节
Spring Authorization Server是Spring生态中为构建安全、现代认证授权服务提供的权威框架,它由Spring Security团队主导开发,基于OAuth 2.1和OpenID Connect 1.0规范,旨在为Java开发者提供一个轻量级、可扩展且生产就绪的授权服务器解决方案。作为Spring Security OAuth的进化版本,它解决了旧版框架在安全性和协议支持方面的局限,成为构建企业级身份认证系统和微服务安全架构的理想选择。本文将深入剖析Spring Authorization Server的核心概念、架构设计、关键特性以及实际应用场景,帮助开发者全面了解并掌握这一重要安全框架。
一、什么是Spring Authorization Server?
Spring Authorization Server是一个基于Java平台的开源框架,提供OAuth 2.1和OpenID Connect 1.0规范的实现。它建立在Spring Security之上,为构建OpenID Connect 1.0身份提供者和OAuth2授权服务器产品提供了一个安全、轻量级和可定制的基础。简单来说,Spring Authorization Server是一个认证授权服务器,用于处理用户身份验证和客户端授权请求,颁发访问令牌供客户端使用,以便客户端能够访问受保护的资源。
Spring Authorization Server的核心功能包括:
- 身份认证:验证用户身份,支持多种认证方式(如表单登录、OAuth2登录等)
- 令牌管理:生成、管理访问令牌和刷新令牌,支持JWT和参考令牌两种格式
- 授权管理:处理客户端授权请求,确定用户是否有权限访问特定资源
- 客户端管理:注册和管理多个客户端应用程序,每个客户端有自己的配置信息
- 协议端点实现:提供OAuth2和OpenID Connect的协议端点(如授权端点、令牌端点等)
与其他认证授权框架相比,Spring Authorization Server的独特之处在于它原生支持OAuth 2.1和OpenID Connect 1.0,解决了旧版Spring Security OAuth在安全性和协议支持方面的不足。它采用模块化设计,允许开发者根据需求选择组件,同时保持与Spring生态的无缝集成。
二、诞生背景
Spring Authorization Server的诞生源于对旧版Spring Security OAuth的反思和改进。在2019年,Spring Security团队宣布不再维护Spring Security OAuth项目,将其标记为"End of Life"。这一决定主要基于以下几个原因:
首先,Spring Security OAuth仅支持OAuth 2.0协议,而随着网络和设备的发展,OAuth 2.0已经不能满足现代安全需求。OAuth 2.1(于2020年发布)引入了多项安全增强功能,如PKCE强制要求、严格重定向URI匹配等,这些特性在旧版框架中无法得到原生支持。
其次,Spring Security OAuth作为Spring Security的扩展,存在架构上的局限性。它与Spring Security的集成不够紧密,导致配置复杂且难以维护。
第三,维护成本高且社区反馈强烈。旧版框架存在技术债务积累和安全缺陷,同时社区开发者普遍反映需要更现代、更安全的授权服务器解决方案。
正是基于这些背景,Spring Security团队于2020年4月15日宣布推出Spring Authorization Server项目,旨在替代已废弃的Spring Security OAuth,为Spring社区提供一个符合现代安全标准的授权服务器实现。
三、架构设计
Spring Authorization Server采用分层架构设计,使其能够灵活应对不同场景的需求。其核心架构分为三个层次:
协议支持层:实现OAuth 2.1和OpenID Connect 1.0规范要求的功能,包括授权端点(/oauth2/authorize)、令牌端点(/oauth2/token)、用户信息端点(/oauth2/userinfo)等。这一层负责处理客户端的认证授权请求,并根据协议规范返回相应的响应。
安全服务层:提供令牌生成、签名验证、用户认证等核心安全服务。包括:
TokenService
:处理令牌的生成和刷新JWKSource
:提供JSON Web密钥(JWK)用于令牌签名OAuth2AuthorizationService
:管理授权信息UserDetailsService
:验证用户身份并获取用户详细信息
存储服务层:负责客户端、授权和令牌数据的持久化存储。提供多种存储实现:
InMemory registeredClientRepository
:内存存储,适合测试环境Jdbc registeredClientRepository
:关系型数据库存储,适合生产环境- 自定义实现:允许开发者根据需求实现自己的存储策略
在Spring Boot环境中,Spring Authorization Server通过自动配置简化了依赖管理。只需添加spring-boot-starter-oauth2-authorization-server
依赖,Spring Boot会自动配置授权服务器的核心组件,开发者只需关注业务逻辑和自定义配置。
对于Spring Cloud微服务架构,Spring Authorization Server可以与Spring Cloud Gateway等组件无缝集成,实现网关级别的统一认证。这种集成方式使得认证服务器成为微服务架构中的核心组件,为整个系统提供统一的身份验证和授权服务。
四、解决的问题
Spring Authorization Server主要解决了以下几个关键问题:
协议升级需求:旧版Spring Security OAuth仅支持OAuth 2.0,而Spring Authorization Server原生支持OAuth 2.1和OpenID Connect 1.0,解决了协议版本过时带来的安全风险。OAuth 2.1强制要求使用PKCE(Proof Key for Code Exchange)来增强授权码流程的安全性,而旧版框架不支持这一特性。
安全增强:Spring Authorization Server整合了OAuth 2.0的安全最佳实践,并将其提升为强制要求。如:
- 禁止使用基于浏览器的应用程序进行授权码授权流程
- 强制使用HTTPS保护令牌传输
- 严格匹配重定向URI防止开放重定向漏洞
- 禁止在URL查询参数中携带访问令牌
简化配置:相比旧版Spring Security OAuth,Spring Authorization Server提供了更简洁的配置方式。通过application.yml
文件即可完成基础配置,无需复杂的XML配置或自定义实现。同时,它支持多种存储方式(内存、数据库等),适应不同环境的需求。
与Spring生态的深度集成:Spring Authorization Server基于Spring Security核心框架构建,与Spring Boot、Spring Cloud等现代生态无缝集成。这种集成使得开发者可以利用Spring生态的丰富功能,如自动配置、安全过滤器链等,简化了认证授权系统的开发和维护。
解决公共客户端的安全问题:对于无法安全存储客户端密钥的公共客户端(如SPA、移动应用),Spring Authorization Server通过PKCE等机制提供安全保障。PKCE通过生成随机的code_verifier和code Challenge,确保即使授权码被拦截,攻击者也无法获取访问令牌。
五、关键特性
Spring Authorization Server提供了丰富的功能特性,使其成为构建现代认证授权服务的理想选择:
1. OAuth 2.1支持
Spring Authorization Server全面支持OAuth 2.1规范,包括以下核心特性:
PKCE强制要求:对于公共客户端,强制要求使用PKCE扩展,增强授权码流程的安全性。通过AuthorizationServerSettings
配置可以启用PKCE验证。
严格重定向URI匹配:要求客户端预先注册的重定向URI必须进行精确匹配,防止开放重定向漏洞。
禁止不安全的授权模式:移除了OAuth 2.0中的不安全授权模式,如密码模式和简化模式。
令牌自省和吊销:提供令牌自省端点(/token/introspection)和令牌吊销端点(/token/revocation),方便资源服务器验证令牌状态和撤销令牌。
元数据端点:自动暴露授权服务器的元数据端点(/.well-known/oauth-authorization-server),提供协议配置信息。
2. OpenID Connect 1.0支持
作为OAuth 2.1的扩展,Spring Authorization Server还支持OpenID Connect 1.0规范,提供以下功能:
用户身份验证:通过ID令牌(ID Token)提供用户身份验证,包含用户声明(如sub、name等)。
动态发现端点:自动暴露OpenID Connect动态发现端点(/.well-known/openid-configuration),提供OpenID Connect配置信息。
单点登录(SSO):支持多个应用之间的单点登录,用户只需登录一次即可访问所有授权应用。
单点登出(SLO):提供单点登出支持,用户登出一个应用时,可以通知其他应用也进行登出。
3. 安全增强特性
HTTPS传输强制:要求令牌端点使用HTTPS传输,防止中间人攻击。
令牌绑定:支持令牌绑定机制,将令牌与特定客户端或设备绑定,增强安全性。
刷新令牌轮换:支持每次刷新令牌时生成新的刷新令牌,作废旧的刷新令牌,提高安全性。
用户同意管理:提供用户同意(Consent)管理机制,记录用户对客户端的授权同意情况。
密钥管理:支持动态密钥管理,可以通过JWKSource
提供JSON Web密钥,用于令牌签名和验证。
4. 扩展性
自定义令牌生成:允许开发者通过实现OAuth2TokenGenerator
接口自定义令牌内容。
自定义令牌存储:支持自定义令牌存储实现,如使用Redis等非关系型数据库。
自定义授权逻辑:提供扩展点,允许开发者自定义授权决策和令牌颁发逻辑。
自定义端点行为:支持自定义协议端点的行为,如修改授权页面、令牌响应格式等。
六、与同类产品对比
在认证授权领域,Spring Authorization Server与其他产品相比具有以下优势:
1. 与旧版Spring Security OAuth对比
特性 | Spring Security OAuth | Spring Authorization Server |
---|---|---|
协议支持 | OAuth 2.0 | OAuth 2.1和OpenID Connect 1.0 |
架构设计 | 基于Spring Security的扩展 | 原生集成Spring Security,模块化设计 |
安全特性 | 支持PKCE等扩展,但非强制 | 强制要求PKCE等安全特性,更安全 |
配置方式 | 复杂,需要XML配置 | 简洁,支持YAML配置和自动配置 |
存储支持 | 仅支持内存和自定义存储 | 支持内存、JDBC等多种存储方式 |
Spring Authorization Server最大的优势在于它全面支持OAuth 2.1和OpenID Connect 1.0规范,解决了旧版框架在安全性和协议支持方面的不足。同时,它采用更模块化的设计,简化了配置和使用流程。
2. 与Keycloak对比
Keycloak是一个功能更全面的开源身份和访问管理解决方案,而Spring Authorization Server则更专注于提供OAuth 2.1和OpenID Connect 1.0的实现。两者的主要区别如下:
特性 | Spring Authorization Server | Keycloak |
---|---|---|
定位 | 轻量级框架,专注于OAuth 2.1和OpenID Connect 1.0 | 全功能平台,提供更丰富的身份管理功能 |
配置复杂度 | 简洁,适合Spring生态开发者 | 复杂,需要额外配置 |
扩展性 | 高,基于Spring框架,易于扩展 | 中等,基于JavaEE标准 |
社区支持 | 强大,由Spring Security团队主导 | 强大,拥有活跃的社区 |
适用场景 | Spring Boot/Spring Cloud应用,需要轻量级授权服务器 | 复杂企业级应用,需要全面的身份管理解决方案 |
Spring Authorization Server的优势在于它与Spring生态的深度集成,使得在Spring项目中构建认证授权服务更加简单和高效。而Keycloack的优势在于它提供了更全面的身份管理功能,如用户管理、多因素认证等。
七、使用方法
1. 快速入门示例
创建Spring Boot项目:使用Spring Initializr创建一个Spring Boot项目,添加Web、Security和OAuth2 Authorization Server依赖。
添加依赖:在pom.xml
或build.gradle
中添加以下依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-oauth2-authorization-server</artifactId>
</dependency>
配置授权服务器:在application.yml
中添加基础配置:
server:port: 8080spring:security:oauth2:authorization-server:issuer-uri: http://localhost:8080clients:registered-clients:- client-id: my-clientclient-secret: "{noop}secret"client-authentication-methods:- client_secret_basicauthorization-grant-types:- authorization_code- refresh_tokenredirect-uris:- "http://localhost:9000/login/oauth2/code/my-client"post-logout-redirect-uris:- "http://localhost:9000/"scopes:- read- writetoken:provider: jwtaccess-token-time-to-live: 3600000 # 1小时refresh-token-time-to live: 2592000000 # 30天
配置用户认证:创建UserDetailsService
实现类,用于验证用户身份:
@Configuration
public class SecurityConfig {@Beanpublic UserDetailsService userDetailsService() {InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();manager.createUser(User.withUsername("user").password("{noop}password").roles("USER").build());return manager;}@Bean@Order(1)public SecurityFilterChain authorizationServerSecurityFilterChain(HttpSecurity http) throws Exception {OAuth2AuthorizationServerConfiguration.applyDefaultSecurity(http);http.exceptionHandling((exceptions) -> exceptions. authenticationEntryPoint(new LoginUrlAuthenticationEntryPoint("/login"))). formLogin(Customizer.withDefaults());return http.build();}@Bean@Order(2)public SecurityFilterChain defaultSecurityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()). formLogin(Customizer.withDefaults());return http.build();}@Beanpublic JWKSource<SecurityContext> jwkSource() throwsJOSEException {RSAKey rsaKey = generateRsaKey();JWKSet jwkSet = new JWKSet(rsaKey);return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);}@Beanpublic ProviderSettings providerSettings() {return ProviderSettings.builder().issuer("http://localhost:8080").build();}private RSAKey generateRsaKey() throwsJOSEException {KeyPair keyPair = generateRsaKeyPair();RSAPrivateKey rsaPrivate = (RSAPrivateKey) keyPair.getPrivate();RSAPublicKey rsaPublic = (RSAPublicKey) keyPair.getPublic();return new RSAKeyBuilder().keyID("RSA").modulus(rsaPublic.getModulus()).exponent(rsaPublic.getPublicExponent()).privateExponent(rsaPrivate.getPrivateExponent()).build();}private KeyPair generateRsaKeyPair() throwsJOSEException {KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");keyPairGenerator.initialize(2048);return keyPairGenerator.generateKeyPair();}}
启动应用:运行Spring Boot应用,访问http://localhost:8080
即可看到授权服务器的运行情况。
2. 客户端配置示例
配置Vue.js客户端(SPA):对于单页应用,可以使用PKCE模式进行认证 。
首先,安装必要的依赖:
npm install crypto-js @types/crypto-js
然后,创建PKCE工具文件:
import CryptoJS from 'crypto-js'export function generateCodeVerifier() {return generateRandomString(32)
}export function generateRandomString(length) {let text = ''const possible = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'for (let i = 0; i < length; i++) {text += possible.charAt(Math.floor(Math.random() * possible.length))}return text
}export function generateCodeChallenge(code_verifier) {return base64URL(CryptoJS.SHA256(code_verifier))
}export function base64URL(str) {return str.toString(CryptoJS.enc.Base64).replace(/=/g, '').replace(/\+/g, '-').replace(/\//g, '_')
}export function base64Str(str) {return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(str))
}
在Vue组件中,实现授权流程:
import { ref, onMounted } from 'vue'
import { generateCodeVerifier, generateCodeChallenge } from './pkce'export default {setup() {const code = ref('')const code_verifier = ref('')onMounted(() => {code_verifier.value = generateCodeVerifier()const code Challenge = generateCodeChallenge(code_verifier.value)const authUrl = `http://localhost:8080/oauth2/authorize?response_type=code&client_id=my-client&redirect_uri=http://localhost:9000/login/oauth2/code/my-client&code Challenge=${code Challenge}&code Challenge _ method=S256`window.location.href = authUrl})// 处理回调const authCode = new URLSearchParams(window.location.search).get('code')if (authCode) {// 使用code和code-verifier换取token// ...}return { code }}
}
3. 资源服务器配置
配置资源服务器:在需要保护资源的微服务中,配置资源服务器以验证令牌。
@Configuration
@EnableWebSecurity
public class ResourceServerConfig {@Beanpublic SecurityFilterChain resourceServerSecurityFilterChain(HttpSecurity http) throws Exception {http.authorizeHttpRequests((authorize) -> authorize.anyRequest().authenticated()).oauth2ResourceServer((resourceServer) -> resourceServer.jwt(jwt -> jwt. jwkSetUri("http://localhost:8080/.well-known/jwkset")));return http.build();}}
保护API端点:在资源服务器中,可以通过注解保护特定API端点:
@RestController
public class securesController {@GetMapping("/api/secures")@PreAuthorize("hasScope('read') or hasScope('write')")public String getSecures() {return "Secures resource accessed successfully";}}
八、最佳实践
1. 安全配置最佳实践
启用PKCE:对于公共客户端,强制启用PKCE以增强安全性:
@Bean
public AuthorizationServerSettings authorizationServerSettings() {return AuthorizationServerSettings.builder(). requireProofKey(true) // 强制PKCE. build();
}
使用HTTPS:确保所有协议端点使用HTTPS传输,防止中间人攻击。
严格重定向URI匹配:要求客户端注册的重定向URI必须精确匹配,防止开放重定向漏洞。
设置合理的令牌有效期:根据应用场景设置适当的访问令牌和刷新令牌有效期:
spring:security:oauth2:authorization-server:token:access-token-time-to-live: 3600000 # 1小时refresh-token-time-to-live: 2592000000 # 30天
启用刷新令牌轮换:每次刷新令牌时生成新的刷新令牌,提高安全性:
@Bean
public TokenSettings tokenSettings() {return TokenSettings.builder(). reuseRefreshTokens(false) // 刷新令牌轮换. build();
}
2. 性能优化最佳实践
使用JWT令牌:JWT令牌是自包含的,资源服务器无需与授权服务器通信即可验证令牌,提高了性能。
启用缓存:对于频繁访问的端点,启用缓存以提高响应速度:
spring:security:authorization-server:endpoints:authorization:cache: true
使用内存存储:对于测试环境,使用内存存储以简化配置和部署。
使用数据库存储:对于生产环境,使用JDBC存储客户端和授权信息,确保数据持久化:
spring:authorization-server:clients:registered-clients:- client-id: my-clientclient-secret: "{noop}secret"client-authentication-methods:- client_secret_basicauthorization-grant-types:- authorization_code- refresh_tokenredirect-uris:- "http://localhost:9000/login/oauth2/code/my-client"post-logout-redirect-uris:- "http://localhost:9000/"scopes:- read- write
添加依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency><groupId>com.h2database</groupId><artifactId>h2</artifactId><scope>runtime</scope>
</dependency>
初始化数据库表:
CREATE TABLEoauth2 registered_client (id VARCHAR(100) PRIMARY KEY,client_id VARCHAR(100) NOT NULL,client_secret VARCHAR(200) NOT NULL,clientAuthenticationMethods VARCHAR(1000) DEFAULT NULL,authorizationGrantTypes VARCHAR(1000) DEFAULT NULL,redirectUris VARCHAR(1000) DEFAULT NULL,postLogoutRedirectUris VARCHAR(1000) DEFAULT NULL,scopes VARCHAR(1000) DEFAULT NULL,clientSettings VARCHAR(2000) DEFAULT NULL,tokenSettings VARCHAR(2000) DEFAULT NULL
);CREATE TABLEoauth2 Authorization (id VARCHAR(100) PRIMARY KEY,registered_client_id VARCHAR(100) NOT NULL,principal_name VARCHAR(200) NOT NULL,authorization_grant_type VARCHAR(100) NOT NULL,authorized_scopes VARCHAR(1000) DEFAULT NULL,attributes VARCHAR(4000) DEFAULT NULL,state VARCHAR(500) DEFAULT NULL,authorization_code_value VARCHAR(4000) DEFAULT NULL,authorization_code_issued_at DATETIME DEFAULT NULL,authorization_code_expires_at DATETIME DEFAULT NULL,authorization_code Principal_name VARCHAR(200) DEFAULT NULL,access_token_value VARCHAR(4000) DEFAULT NULL,access_token_issued_at DATETIME DEFAULT NULL,access_token_expires_at DATETIME DEFAULT NULL,access_token Principal_name VARCHAR(200) DEFAULT NULL,refresh_token_value VARCHAR(4000) DEFAULT NULL,refresh_token_issued_at DATETIME DEFAULT NULL,refresh_token_expires_at DATETIME DEFAULT NULL,refresh_token Principal_name VARCHAR(200) DEFAULT NULL,id_token_value VARCHAR(4000) DEFAULT NULL,id_token_issued_at DATETIME DEFAULT NULL,id_token_expires_at DATETIME DEFAULT NULL,id_token Principal_name VARCHAR(200) DEFAULT NULL
);
配置JDBC存储:
@Configuration
public class AuthorizationServerConfig {@Autowiredprivate JdbcTemplate模板;@Beanpublic registeredClientRepository registeredClientRepository() {return new JdbcregisteredClientRepository(模板);}@Beanpublic OAuth2AuthorizationService authorizationService() {return new JdbcOAuth2AuthorizationService(模板, registeredClientRepository());}@Beanpublic OAuth2AuthorizationConsentService authorizationConsentService() {return new JdbcOAuth2AuthorizationConsentService(模板, registeredClientRepository());}}
3. 监控和日志最佳实践
启用详细的日志记录:在application.yml
中配置详细的日志记录,便于调试和监控:
logging:level:org.springframework.security: traceorg.springframework authorization server: debug
集成Spring Boot Actuator:添加Actuator依赖,暴露监控端点:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置健康检查:在application.yml
中配置健康检查:
management:endpoints:web:exposure:include: health,infoendpoint:health:show-components: always
配置审计日志:记录重要的安全事件,如用户登录、令牌颁发等:
@Configuration
public class AuditLogConfig {@Beanpublic AuditLogService auditLogService() {return new AuditLogService();}}
使用ELK栈(Elasticsearch, Logstash, Kibana):收集和分析授权服务器的日志,便于监控和故障排查。
定期备份和恢复:定期备份授权服务器的数据,确保在出现故障时能够快速恢复。
九、应用场景
Spring Authorization Server适用于多种应用场景,以下是几个典型的应用场景:
1. 微服务架构中的认证授权
在微服务架构中,Spring Authorization Server可以作为认证与授权的中心节点。通过OAuth 2.1令牌机制,可以确保微服务之间的安全通信。如,一个订单服务需要访问用户服务的用户信息,可以通过向授权服务器请求访问令牌,然后使用该令牌访问用户服务。
2. 单点登录(SSO)
Spring Authorization Server可以作为企业内部单点登录(SSO)解决方案的核心组件。通过配置OAuth 2.0客户端和资源服务器,可以实现多个应用之间的无缝登录体验。如,企业有多个内部应用,用户只需登录一次授权服务器,就可以访问所有授权应用。
3. 第三方应用授权
Spring Authorization Server可以用于实现第三方应用授权,允许第三方应用通过OAuth 2.1协议访问受保护的资源。如,社交媒体应用可以授权第三方应用访问其用户数据。
4. 移动应用和SPA认证
对于移动应用和单页应用(SPA),Spring Authorization Server支持PKCE扩展,提供安全的认证机制。通过PKCE,即使授权码被拦截,攻击者也无法获取访问令牌,提高了公共客户端的安全性。
5. 物联网(IoT)设备认证
在物联网场景中,Spring Authorization Server可以作为设备的认证授权中心,为各种IoT设备提供安全的认证机制。如,智能家居系统中,各种智能设备可以通过授权服务器进行认证,访问家庭云服务。
十、总结与展望
Spring Authorization Server作为Spring生态中认证授权领域的权威框架,为Java开发者提供了构建安全、现代认证授权服务的理想选择。它原生支持OAuth 2.1和OpenID Connect 1.0规范,解决了旧版框架在安全性和协议支持方面的不足,同时与Spring Boot、Spring Cloud等现代生态无缝集成,简化了配置和使用流程。
随着OAuth协议和OpenID Connect标准的不断演进,Spring Authorization Server也在持续更新和完善。未来,我们可以期待它支持更多OAuth 2.1扩展功能,如设备授权码模式、令牌绑定等,为Java开发者提供更全面的认证授权解决方案。
对于正在构建认证授权服务的Java开发者,Spring Authorization Server是一个值得考虑的选择。它不仅提供了现代安全标准的实现,还通过与Spring生态的深度集成,使得认证授权服务的开发和维护更加简单和高效。同时,其丰富的扩展点和自定义能力,也使得开发者可以根据特定需求定制认证授权流程。
参考资料:
- Spring Authorization Server 文档
本博客专注于分享开源技术、微服务架构、职场晋升以及个人生活随笔,这里有:
📌 技术决策深度文(从选型到落地的全链路分析)
💭 开发者成长思考(职业规划/团队管理/认知升级)
🎯 行业趋势观察(AI对开发的影响/云原生下一站)
关注我,每周日与你聊“技术内外的那些事”,让你的代码之外,更有“技术眼光”。
日更专刊:
🥇 《Thinking in Java》 🌀 java、spring、微服务的序列晋升之路!
🏆 《Technology and Architecture》 🌀 大数据相关技术原理与架构,帮你构建完整知识体系!关于愚者Turbo:
🌟博主GitHub
🌞博主知识星球