在不丢失可配置端点的情况下覆盖弹簧安全执行器
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
的值,但是当值等于""
时如何管理它?
您可以回复我到@Autowired
EndpointHandlerMapping
并检索Actuators
端点列表...最后我将复制过去与ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter
相同的逻辑。
此外,ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter
@ConditionalOnMissingBean
指向自身,但 ManagementSecurityAutoConfiguration.ManagementWebSecurityConfigurerAdapter
是内部静态受保护类,因此如果不传递参数 management.security.enabled=false
就无法禁用它,这可能很奇怪,因为您的配置说 management.security.enabled=false
但实际上端点是安全的...
结论
-
有没有办法正确覆盖(只是一部分)
Actuators
security
我可能错过了什么,我完全错了吗?
【问题讨论】:
【参考方案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 上跟踪问题,希望有一天它会修复以上是关于在不丢失可配置端点的情况下覆盖弹簧安全执行器的主要内容,如果未能解决你的问题,请参考以下文章