如何在 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 中实现基于角色权限的系统

Spring Boot:考虑到用户角色,如何编写自定义 Pre Filter?

217.Spring Boot+Spring Security:基于内存的角色授权

如何在 Spring-Boot-REST 调用中获取用户信息?