OAuth2AuthorizationServerAutoConfiguration
是 Spring Boot 提供的自动配置类,用于自动设置 OAuth2 授权服务器。它是 Spring Authorization Server 项目的一部分,提供了 OAuth 2.1 和 OpenID Connect 1.0 规范的实现。
@AutoConfiguration
:
标记这是一个自动配置类
before
属性指定了该配置应在资源服务器、安全配置和用户详情服务配置之前加载
@ConditionalOnClass({OAuth2Authorization.class})
:
类路径中存在 OAuth2Authorization
类时才启用此自动配置
@ConditionalOnWebApplication(type = Type.SERVLET)
:
仅适用于基于 Servlet 的 Web 应用程序
@Import
:
导入了两个关键配置类:
OAuth2AuthorizationServerConfiguration
: 配置核心授权服务器功能
OAuth2AuthorizationServerWebSecurityConfiguration
: 配置 Web 安全相关设置
这个自动配置类适用于以下场景:
需要实现 OAuth2 授权服务器的应用
需要支持 OAuth2 授权码模式、客户端凭证模式等授权流程
需要提供 OpenID Connect 服务
需要集中管理客户端应用和用户授权
首先,添加必要的依赖:
org.springframework.boot
spring-boot-starter-oauth2-authorization-server
@SpringBootApplication
public class AuthServerApplication {
public static void main(String[] args) {
SpringApplication.run(AuthServerApplication.class, args);
}
}
@Configuration
public class ClientConfig {
@Bean
public RegisteredClientRepository registeredClientRepository() {
RegisteredClient registeredClient = RegisteredClient.withId(UUID.randomUUID().toString())
.clientId("client")
.clientSecret("{noop}secret")
.clientAuthenticationMethod(ClientAuthenticationMethod.CLIENT_SECRET_BASIC)
.authorizationGrantType(AuthorizationGrantType.AUTHORIZATION_CODE)
.authorizationGrantType(AuthorizationGrantType.REFRESH_TOKEN)
.redirectUri("http://127.0.0.1:8080/login/oauth2/code/client")
.scope("read")
.scope("write")
.clientSettings(ClientSettings.builder().requireAuthorizationConsent(true).build())
.build();
return new InMemoryRegisteredClientRepository(registeredClient);
}
}
@Configuration
public class UserConfig {
@Bean
public UserDetailsService users() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("password")
.roles("USER")
.build();
return new InMemoryUserDetailsManager(user);
}
}
@Configuration
public class AuthorizationServerConfig {
@Bean
public ProviderSettings providerSettings() {
return ProviderSettings.builder()
.issuer("http://auth-server:9000")
.build();
}
}
1、获取授权码:
GET /oauth2/authorize?response_type=code&client_id=client&redirect_uri=http://127.0.0.1:8080/login/oauth2/code/client&scope=read
2、获取访问令牌:
POST /oauth2/token
Content-Type: application/x-www-form-urlencoded
Authorization: Basic Y2xpZW50OnNlY3JldA==
grant_type=authorization_code&code={code}&redirect_uri=http://127.0.0.1:8080/login/oauth2/code/client
1、JWT 令牌配置:
@Bean
public JWKSource jwkSource() {
KeyPair keyPair = generateRsaKey();
RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
RSAKey rsaKey = new RSAKey.Builder(publicKey)
.privateKey(privateKey)
.keyID(UUID.randomUUID().toString())
.build();
JWKSet jwkSet = new JWKSet(rsaKey);
return (jwkSelector, securityContext) -> jwkSelector.select(jwkSet);
}
private static KeyPair generateRsaKey() {
KeyPair keyPair;
try {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
keyPair = keyPairGenerator.generateKeyPair();
} catch (Exception ex) {
throw new IllegalStateException(ex);
}
return keyPair;
}
2、自定义令牌增强器:
@Bean
public OAuth2TokenCustomizer tokenCustomizer() {
return context -> {
if (context.getTokenType().getValue().equals("access_token")) {
// 添加自定义声明
context.getClaims().claim("custom-claim", "custom-value");
// 添加用户角色
Authentication principal = context.getPrincipal();
if (principal instanceof UsernamePasswordAuthenticationToken) {
Set authorities = principal.getAuthorities().stream()
.map(GrantedAuthority::getAuthority)
.collect(Collectors.toSet());
context.getClaims().claim("authorities", authorities);
}
}
};
}
OAuth2AuthorizationServerAutoConfiguration
简化了 Spring Authorization Server 的配置过程,通过自动配置机制提供了开箱即用的 OAuth2 授权服务器功能。开发者只需添加少量配置即可快速搭建一个符合标准的授权服务器,支持各种 OAuth2 授权流程和 OpenID Connect 协议。