在不丢失可配置端点的情况下覆盖 spring 安全执行器

Overriding spring security actuator without loosing configurable endpoints

我正在尝试保护 Spring Boot 项目内的端点 Actuators。然而,而不是使用 ready-to-运行 Spring Security 配置 Actuators:

management:
  security:
    enabled: true
    role: ADMINISTRATOR

太简单了我需要插入 Actuators 我们的自定义安全性(这里是 CAS SSO)。

首先尝试为 Actuators 添加 context-path:

management:
  security:
    enabled: true
    role: ADMINISTRATOR
  context-path: /management

并更新我的 WebSecurityConfigurerAdapter 配置

@Override
protected void configure(HttpSecurity http) throws Exception {
    ...
    http.authorizeRequests()..antMatchers("/management/**").hasRole(Role.ADMINISTRATOR.toString());
    ...
} 

它有效,但我必须硬编码 Actuators context-path,所以当我想更新 management.context-path 时,我必须更新我的安全性。

我知道可以检索 management.context-path 的值,但是当值等于 "" 时如何管理它?

您可以回答我 @Autowired EndpointHandlerMapping 并检索 Actuators 个端点列表...最后我将复制过去与 ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter 相同的逻辑。

此外 ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter @ConditionalOnMissingBean 指向自身但是 ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter 是内部静态保护的 class 所以如果不传递参数 management.security.enabled=false 和这可能很奇怪,因为您的配置说 management.security.enabled=false 但实际上端点是安全的...


结论

  1. 有没有办法正确覆盖(只是一部分)Actuators 安全性
  2. 我可能漏掉了什么,我完全错了?

Github. For the moment Dave Syer proposes 上已经有一个未决问题:

I think copy-paste of all the code in there is actually the best solution for now (and set management.security.enabled=false to let Boot know you want to do it yourself).

我没有测试是否会抛出运行时异常,但我认为您可以重用 ManagementWebSecurityConfigurerAdapter 并节省大量复制粘贴操作。至少编译器不会抱怨。

将您的配置 class 放在项目中的包 org.springframework.boot.actuate.autoconfigure 下,并从 ManagementWebSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter 扩展。不要错过 ManagementWebSecurityConfigurerAdapter 中的所有注释。这是这里唯一的复制粘贴操作,因为 class 注释不能被 subclass.

继承
package org.springframework.boot.actuate.autoconfigure;

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
@ConditionalOnProperty(prefix = "management.security", name = "enabled", matchIfMissing = true)
@Order(ManagementServerProperties.BASIC_AUTH_ORDER)
public class SsoManagementWebSecurityConfigurerAdapter extends ManagementWebSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter {

    //TODO your SSO configuration

}

不要忘记 @Import 您在 @SpringBootApplication 中的配置。