如何在 Spring Boot 2 中保护具有角色的执行器端点?
Posted
技术标签:
【中文标题】如何在 Spring Boot 2 中保护具有角色的执行器端点?【英文标题】:How to secure actuator endpoints with role in Spring Boot 2? 【发布时间】:2019-09-30 17:25:26 【问题描述】:您能帮助保护 Spring Boot 2 中的执行器端点吗?我检查了迁移指南,但它对我没有帮助。
这是我的安全配置:
@Configuration
@EnableWebSecurity
public class SecConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
http
.authorizeRequests()
.requestMatchers(EndpointRequest.toAnyEndpoint()).hasRole("ADMIN")
.anyRequest().authenticated();
但是当我转到http://localhost:8080/actuator/health
时,它无需登录即可加载。其他前缀为 /actuator
的端点也不需要登录。我做错了什么?
我还使用此配置添加了 OAuth:
@Configuration
@EnableAuthorizationServer
public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception
clients
.inMemory()
.withClient("client-id")
.scopes("read", "write")
.authorizedGrantTypes("password")
.secret("xxxxxx")
.accessTokenValiditySeconds(6000);
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter
@Override
public void configure(HttpSecurity http) throws Exception
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/ajax/**").authenticated()
.and()
.csrf()
.disable();
【问题讨论】:
@DennisGlot 我开始了新项目,这是第一个配置:/ 我只是在 configureGlobal(AuthenticationManagerBuilder auth) 中添加了 userService 和密码编码器 @DenisStephanov 您是否在一个应用程序中拥有所有配置? AFAIR 那么你的配置顺序是AuthorizationServerConfig
(仅OAuth2端点)、ResourceServerConfig
(所有端点)和SecConfig
(从未使用过)。
@DenisStephanov 你必须限制你的资源配置。例如,您可以将.antMatcher("/ajax/**")
添加到您的资源服务器配置中,以仅应用/ajax/**
的配置而不应用/actuator
的配置。
【参考方案1】:
如果您的应用程序是资源服务器,则不需要 SecConfig 类。
因此,如果您删除它,在您的 ResourceServerConfig
类中,您可以保护执行器并让管理员通过:
@Configuration
@EnableResourceServer
public class ResourceServerConfig extends ResourceServerConfigurerAdapter
@Override
public void configure(HttpSecurity http) throws Exception
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/ajax/**").authenticated()
.antMatchers("/actuator/**").hasRole("ADMIN")
.anyRequest().authenticated()
.and()
.csrf()
.disable();
我添加了.anyRequest().authenticated()
以保护其余的应用程序端点。
【讨论】:
推荐这个是为了提到基于资源服务器和授权服务器的解决方案 我试过了,它看起来有效,谢谢。但这是在 Spring Boot 2 中如何做的一种方法吗?我以为是开机1.5倍 是的,是spring boot 2,HttpSecurity的配置变化不大。本示例的所有测试均使用 2.1.x 版本进行。【参考方案2】:你可以试试下面的配置
@Configuration
public class SecConfig extends WebSecurityConfigurerAdapter
public void configure(HttpSecurity http) throws Exception
http.authorizeRequests()
.antMatchers("/actuator/**").hasRole("ACTUATOR")
.anyRequest().permitAll();
验证您在 application.properties 中有以下内容:
spring.security.user.name=user
spring.security.user.password=pass
spring.security.user.roles=ACTUATOR,USER # or any other role
management.endpoint.health.roles=ACTUATOR
【讨论】:
这对我不起作用...我还尝试添加拒绝所有端点来测试我的安全性,但它对此没有任何影响:/ 出了点问题,但我不知道什么【参考方案3】:@Configuration
@Order(1)
public class ActuatorSecurityConfig extends WebSecurityConfigurerAdapter
@Override
protected void configure(HttpSecurity http) throws Exception
log.info("configuring actuator security");
// secure actuator endpoints with with ADMIN role
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests()
.anyRequest().hasRole("ADMIN");
// but publicly allow the health endpoint
http.requestMatchers(EndpointRequest.to(HealthEndpoint.class)).permitAll()
另请参阅文档中的示例:https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints.security:
@Configuration(proxyBeanMethods = false)
public class MySecurityConfiguration
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception
http.requestMatcher(EndpointRequest.toAnyEndpoint())
.authorizeRequests((requests) -> requests.anyRequest().hasRole("ENDPOINT_ADMIN"));
http.httpBasic();
return http.build();
在最后一个示例中,请注意 Spring Boot 的安全配置在任何 SecurityFilterChain
bean 存在时完全退出。
【讨论】:
以上是关于如何在 Spring Boot 2 中保护具有角色的执行器端点?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Spring Boot 中从 Azure SAML 2.0 应用程序获取角色或组
如何在 Spring Boot 中使用 Thymeleaf 保存角色?
Spring Boot:考虑到用户角色,如何编写自定义 Pre Filter?