You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何仅在客户端侧使用Spring Security OAuth2 Client?

如何仅在客户端侧使用Spring Security OAuth2?

我完全懂你的困扰——你只想用Spring Security OAuth2的客户端能力去调用外部服务,压根不想让自己服务的任何端点(包括actuator)被保护,但引入spring-security-oauth2-client后,Spring Boot的自动配置默认把所有端点都锁起来了,这确实挺闹心的。

问题根源

spring-security-oauth2-client依赖出现在classpath里时,它会间接引入spring-security-webspring-security-config。Spring Boot的SecurityAutoConfiguration会检测到这些依赖,自动启用默认安全规则:所有HTTP请求都要求认证,这就是你的actuator端点突然被保护的原因。

正确解决方案:自定义安全配置,开放所有端点

你不需要给actuator额外加认证(像你之前的临时方案那样),只需要覆盖默认的Spring Security配置,让所有请求允许匿名访问,同时保留OAuth2客户端的功能。

方案1:使用WebSecurityConfigurerAdapter(适配Spring Boot 2.7及以下版本)

创建一个安全配置类,直接开放所有请求:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            // 允许所有请求匿名访问
            .authorizeRequests()
                .anyRequest().permitAll()
            .and()
            // 如果你的服务是纯后端服务(非Web应用),可以禁用CSRF保护
            .csrf().disable();
    }
}

方案2:使用SecurityFilterChain(Spring Boot 2.7+推荐方式)

如果你用的是较新版本的Spring Boot,推荐用基于组件的安全配置:

@Configuration
public class SecurityConfig {
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                // 允许所有请求无需认证
                .anyRequest().permitAll()
            )
            .csrf(csrf -> csrf.disable()); // 根据自身业务需求决定是否禁用CSRF
        return http.build();
    }
}

为什么这个方案有效?

  • 这个配置会覆盖Spring Boot的默认安全规则,让所有端点(包括actuator的/info/health/prometheus等)都能自由访问。
  • 同时,OAuth2客户端的自动配置完全不受影响:你的spring.security.oauth2.client配置(client-id、tokenUri等)会被正常加载,OAuth2AuthorizedClientManager和你自定义的OAuth2AuthorizedClientInterceptor也能正常工作,完全不影响你作为客户端获取token调用外部服务。

避坑提醒:不要完全禁用Security自动配置

别尝试用@SpringBootApplication(exclude = SecurityAutoConfiguration.class)禁用所有安全自动配置,这样会同时关掉OAuth2客户端的相关Bean,直接导致你的客户端功能失效。我们只需要修改安全规则,而非完全移除Security组件。


内容的提问来源于stack exchange,提问作者Ruth

火山引擎 最新活动