Spring Boot Management 安全性与端口集的工作方式不同

Posted

技术标签:

【中文标题】Spring Boot Management 安全性与端口集的工作方式不同【英文标题】:Spring Boot Management security works differently with port set 【发布时间】:2015-07-09 11:56:52 【问题描述】:

我正在尝试配置具有执行器支持的 Spring Boot 应用程序(1.2.3,但对于 1.2.4.BUILD-SNAPSHOT 版本也失败)。我想使用 Actuator 安全配置来控制对管理端点的访问,以及我们自己对应用程序其余部分的身份验证。

这是我的安全配置:

@Configuration
@EnableWebSecurity
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter


    @Autowired
    private CustomAuthenticationProvider customAuthProvider;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception
    
        auth.authenticationProvider(customAuthProvider);
    

    @Override
    protected void configure(HttpSecurity http) throws Exception
    
        http
            .authorizeRequests()
            .regexMatchers(API_DOC_REGEX).permitAll()
            .regexMatchers(String.format(PATH_REGEX, PUBLIC_ACCESS)).permitAll()
            .regexMatchers(String.format(PATH_REGEX, INTERNAL_ACCESS)).access("isAuthenticated() && authentication.hasOrigin('INTERNAL')")
            .regexMatchers(String.format(PATH_REGEX, EXTERNAL_AUTHENTICATED_ACCESS)).authenticated()
            .antMatchers("/**").denyAll()
            .and()
            .sessionManagement().sessionCreationPolicy(SessionCreationPolicy.NEVER)
            .and()
            .addFilterAfter(customAuthProcessingFilter(), BasicAuthenticationFilter.class)
            .csrf().disable();
    


当我没有设置管理端口时,这可以正常工作,但是当我设置管理端口时,管理 URL 会返回 401 响应。如果我注释掉.antMatchers("/**").denyAll() 行,那么一切都不需要身份验证即可完成。因此,当我设置自定义端口时,它看起来像是在为执行器端点使用我的应用程序的安全配置,但我不确定为什么。

如何让它在自定义端口上运行时使用它自己的安全性?

【问题讨论】:

添加另一个具有@Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER)WebSecurityConfigurerAdapter,如here 中所述 看起来这就是我在做什么?文档说The Actuator security features can be modified using external properties (management.security.*). To override the application access rules add a @Bean of type WebSecurityConfigurerAdapter and use @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) if you don’t want to override the actuator access rules, or @Order(ManagementServerProperties.ACCESS_OVERRIDE_ORDER) if you do want to override the actuator access rules. 不,你配置的是通用应用规则而不是管理规则。 【参考方案1】:

扩展来自@M. Deinum 的评论,为管理的东西添加另一个适配器(即使它已经有一个)似乎已经修复了它。这是我结束的课程:

@Order(0)
@Configuration
public class ManagementSecurityConfig extends WebSecurityConfigurerAdapter


    @Autowired
    ManagementServerProperties managementProperties;

    @Override
    protected void configure(HttpSecurity http) throws Exception
    
        http
                .requestMatchers()
                .requestMatchers(new RequestMatcher()
                

                    @Override
                    public boolean matches(HttpServletRequest request)
                    
                        return managementProperties.getContextPath().equals(request.getContextPath());
                    
                )
                .and()
                .authorizeRequests()
                .anyRequest().hasRole("ADMIN")
                .and()
                .httpBasic();
    

【讨论】:

以上是关于Spring Boot Management 安全性与端口集的工作方式不同的主要内容,如果未能解决你的问题,请参考以下文章

在 tomcat 容器中具有多个 Web 应用程序的 Spring Boot 执行器引发 javax.management.InstanceAlreadyExistsException 异常

jconsole监控远程 spring boot程序

management & Actuator

Spring Boot 2 Actuator 端点在 GET 请求上返回 405

Spring boot - 如何获取正在运行的端口和IP地址[重复]

spring boot actuator 如何显示详细信息