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

Posted

技术标签:

【中文标题】在不丢失可配置端点的情况下覆盖弹簧安全执行器【英文标题】:Overriding spring security actuator without loosing configurable endpoints 【发布时间】:2016-02-05 03:14:57 【问题描述】:

我正在尝试在 Spring Boot 项目中保护端点 Actuators。但是,改为使用准备运行的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 的值,但是当值等于"" 时如何管理它?

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

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


结论

    有没有办法正确覆盖(只是一部分)Actuatorssecurity 我可能错过了什么,我完全错了吗?

【问题讨论】:

【参考方案1】:

Github 上已经有一个待处理的问题。暂时 Dave Syer proposes:

我认为复制粘贴其中的所有代码实际上是最好的 现在的解决方案(并设置 management.security.enabled=false 让 引导知道你想自己做)。

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

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

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 中的配置。

【讨论】:

好吧,除了我没有使用 Spring 包之外,我做了几乎相同的事情,我只是复制了我需要的一段代码。我会接受答案,因为它证明没有正确的方法可以做我想做的事。我会在 github 上跟踪问题,希望有一天它会修复

以上是关于在不丢失可配置端点的情况下覆盖弹簧安全执行器的主要内容,如果未能解决你的问题,请参考以下文章

弹簧引导执行器端点未通过HTTP公开

使用 oauth2 范围而不是角色来保护弹簧执行器管理端点

是否可以覆盖弹簧安全认证错误消息

轮询弹簧启动执行器端点的更好方法(流式传输而不是轮询?)

Spring Boot Actuator

如何检查所有弹簧占位符是不是存在?