spring 如何在不完全禁用Sping Boot 2的情况下禁用执行器安全性

nkoocmlb  于 2023-02-28  发布在  Spring
关注(0)|答案(8)|浏览(133)

我正在将Sping Boot Security与OAuth2配合使用。我不想禁用健康终结点的安全性。
我可以完全禁用安全性,或者编写自己的WebSecurityConfigurerAdapter实现并禁用自动配置的实现。
但是如何修改WebSecurityConfigurerAdapterOAuth2SsoDefaultConfiguration)的现有实现呢?
我试图创建自己的配置而不禁用自动配置的配置,但由于Order冲突,这是不可能的。
下面是错误消息:

Caused by: java.lang.IllegalStateException: @Order on WebSecurityConfigurers must be unique. 
Order of 100 was already used on SecurityConfiguration$$EnhancerBySpringCGLIB$$9505fc58@13f182b9,
 so it cannot be used on 
org.springframework.boot.autoconfigure.security.oauth2.client.OAuth2SsoDefaultConfiguration$$EnhancerBySpringCGLIB$$dc290e2b@5ee0cf64 too.

此外,我试图显式地为自己的安全配置设置更高的顺序,但看起来自动配置的优先级会覆盖我的。
那么,如何在不重新实现整个配置的情况下覆盖特定的安全规则呢?

368yc8dk

368yc8dk1#

您需要在中实现以下方法
@SpringBootApplication

@SpringBootApplication
 @EnableResourceServer
 @EnableGlobalMethodSecurity(prePostEnabled = true)
 @Configuration
 public class BusinessLogicServiceApplication extends ResourceServerConfigurerAdapter {

 public static void main(String[] args) throws IOException {
    ConfigurableApplicationContext context =  
    SpringApplication.run(BusinessLogicServiceApplication.class, args);
    }

  @Override
  public void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .antMatchers("/health").permitAll().anyRequest().authenticated();

    }
}
1bqhqjot

1bqhqjot2#

@Configuration
@EnableOAuth2Sso
class MyConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/actuator/health")
                .permitAll()
            .anyRequest()
                .authenticated();
    }

}

确保在WebSecurityConfigurerAdapter类上使用@EnableOAuth2Sso,这一点很重要,因为它将包含OAuth2SsoCustomConfigurationOAuth2SsoCustomConfiguration基本上复制了OAuth2SsoDefaultConfiguration#configure的功能。
您可能还希望显示完整的健康详细信息:

management:
  endpoint:
    health:
      show-details: always
axkjgtzd

axkjgtzd3#

以下是可能的检查。

    • 溶液1**:确保您正在使用

org.springframework.core.annotation.Order
代替
org.apache.logging.log4j.core.config.Order
由于Spring没有解析正确的注解,因此它假设两种配置的默认值都是100。

    • 溶液2**:

也许你已经用@EnableWebSecurity标注了另一个类,但是要注意只有一个类可以实现这个标注。

解决方案四:

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class DemoConfigurer extends WebSecurityConfigurerAdapter {
    @Override
    public void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests().antMatchers("/health").permitAll();
        super.configure(http);
    }
}
0pizxfdo

0pizxfdo4#

我认为您可以使用自己的实现来扩展您使用的实现(OAuth2SsoDefaultConfiguration,如果我没弄错的话),然后扩展configure方法以忽略您的健康端点。

@Override
public void configure(final HttpSecurity http) throws Exception {
    http.regexMatchers("/health",)
        .permitAll()
}

顺便说一下Also, I tried to explicitly set higher order for my own security configuration, but looks like autoconfigured one overrides mine.@Order的工作方式是,数字越小优先级越高,所以这就解释了为什么自动配置会覆盖你的。https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/core/annotation/Order.html

ztyzrc3y

ztyzrc3y5#

management.security.enabled:false在spring Boot 2中不再有效。我们需要采取ConfigurerAdapter的方式。下面是我使用OAuth2资源服务器时的代码。

import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.oauth2.config.annotation.web.configuration.ResourceServerConfigurerAdapter;

/**
 * to disable security for acutator endpoints.
 *
 */
@Configuration
public class ActuatorSecurityConfigurer extends ResourceServerConfigurerAdapter {

    @Override
    public void configure(HttpSecurity httpSecurity) throws Exception {
        httpSecurity.authorizeRequests().antMatchers("/actuator").permitAll();
    }
}
5us2dqdw

5us2dqdw6#

management.security.enabled: false
不适用于 Spring Boot 2.x版本

wmvff8tz

wmvff8tz7#

对于Kotlin

@Configuration
class SecurityConfiguration : WebSecurityConfigurerAdapter() {
    override fun configure(httpSecurity: HttpSecurity) {
        httpSecurity.authorizeRequests().antMatchers("/actuator").permitAll()
    }
}
izj3ouym

izj3ouym8#

您也可以在应用程序中使用management.security.enabled: false.propeeties(或. yaml)。它将自动删除执行器公开端点的任何安全性

相关问题