OAuth2AuthorizationServerAutoConfiguration类介绍、应用场景和示例代码

概述

OAuth2AuthorizationServerAutoConfiguration 是 Spring Boot 提供的自动配置类,用于自动设置 OAuth2 授权服务器。它是 Spring Authorization Server 项目的一部分,提供了 OAuth 2.1 和 OpenID Connect 1.0 规范的实现。

关键注解解析

  1. @AutoConfiguration:

    • 标记这是一个自动配置类

    • before 属性指定了该配置应在资源服务器、安全配置和用户详情服务配置之前加载

  2. @ConditionalOnClass({OAuth2Authorization.class}):

    • 类路径中存在 OAuth2Authorization 类时才启用此自动配置

  3. @ConditionalOnWebApplication(type = Type.SERVLET):

    • 仅适用于基于 Servlet 的 Web 应用程序

  4. @Import:

    • 导入了两个关键配置类:

      • OAuth2AuthorizationServerConfiguration: 配置核心授权服务器功能

      • OAuth2AuthorizationServerWebSecurityConfiguration: 配置 Web 安全相关设置

应用场景

这个自动配置类适用于以下场景:

  • 需要实现 OAuth2 授权服务器的应用

  • 需要支持 OAuth2 授权码模式、客户端凭证模式等授权流程

  • 需要提供 OpenID Connect 服务

  • 需要集中管理客户端应用和用户授权

示例代码

1. 基础配置

首先,添加必要的依赖:


    org.springframework.boot
    spring-boot-starter-oauth2-authorization-server

2. 最小配置示例

@SpringBootApplication
public class AuthServerApplication {
    public static void main(String[] args) {
        SpringApplication.run(AuthServerApplication.class, args);
    }
}

3. 注册客户端配置

@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);
    }
}

4. 自定义用户详情服务

@Configuration
public class UserConfig {

    @Bean
    public UserDetailsService users() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("password")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }
}

5. 自定义授权服务器设置

@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 协议。

你可能感兴趣的:(安全框架技术栈,spring,boot,java,java,开发语言,spring,spring,boot,后端)