我正在将Spring Boot Security与OAuth2结合使用。我不会为健康端点禁用安全性。
我可以完全禁用安全性,也可以编写自己的WebSecurityConfigurerAdapter
实现并禁用自动配置的实现。
但是如何修改WebSecurityConfigurerAdapter
(OAuth2SsoDefaultConfiguration
)的现有实现?
我尝试创建自己的配置而不禁用自动配置,但是由于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.
此外,我尝试为自己的安全配置显式设置更高的顺序,但是看起来像自动配置的优先级覆盖了我的安全配置。
那么如何在不重新实现整个配置的情况下覆盖特定的安全规则?
答案 0 :(得分:2)
您需要在
中实现以下方法 @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();
}
}
答案 1 :(得分:1)
我认为您可以拥有自己的实现,以扩展您使用的实现(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
答案 2 :(得分:1)
以下是可能的检查。
解决方案1 : 确保您正在使用
org.springframework.core.annotation.Order
代替
org.apache.logging.log4j.core.config.Order
由于Spring无法解析正确的注释,因此这两种配置均假定默认值为100。
解决方案2 :
也许您已经用@EnableWebSecurity注释注释了另一个类。请注意,只有一个类可以实现此注释。
解决方案3 :请参阅此https://stackoverflow.com/a/44076087/6572971
解决方案4:
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);
}
}
答案 3 :(得分:1)
@Configuration
@EnableOAuth2Sso
class MyConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers("/actuator/health")
.permitAll()
.anyRequest()
.authenticated();
}
}
确保您在@EnableOAuth2Sso
类上使用WebSecurityConfigurerAdapter
。这很重要,因为它将包括OAuth2SsoCustomConfiguration
,基本上可以复制OAuth2SsoDefaultConfiguration#configure
的功能。
您可能还希望显示完整的健康详细信息:
management:
endpoint:
health:
show-details: always
答案 4 :(得分:0)
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();
}
}
答案 5 :(得分:-1)
您也可以使用
management.security.enabled: false
在您的application.propeeties(或yaml)中。它将自动删除执行器暴露端点的任何安全性