使用用户/密码保护执行器端点,同时授予 RestController 的公共访问权限

Posted

技术标签:

【中文标题】使用用户/密码保护执行器端点,同时授予 RestController 的公共访问权限【英文标题】:Protect Actuator endpoints with user/password while granting public access for RestControllers 【发布时间】:2018-10-14 13:42:03 【问题描述】:

我将现有的应用程序从 Spring Boot 1.3 更新到 2.0.1。这个应用程序使用了 Actuator 并公开了一个 REST 风格的 API。

在 Boot 1.3 中,API 无需身份验证即可使用,并且执行器端点被配置为受密码保护:

security.user.name=foo
security.user.password=bar
security-user.role=ADMIN

我更新了 configuration changelog 中记录的内容,并将条目从 security.user.name 重命名为 spring.security.user.name 等。

但是当我尝试 curl 我的 API 时,我被拒绝了,因为我没有提供凭据:

在Spring Blog 中,我找到了一个可能的解决方案,如何在详细级别上配置 Spring Security:

http
    .authorizeRequests()
        // 1
        .requestMatchers(EndpointRequest.to("status", "info"))
            .permitAll()
        // 2
        .requestMatchers(EndpointRequest.toAnyEndpoint())
            .hasRole("ACTUATOR")
        // 3 
        .requestMatchers(StaticResourceRequest.toCommonLocations())
            .permitAll()
        // 4
        .antMatchers("/**")
            .hasRole("USER")
    .and()
  ...

但这比我需要的更细粒度,我正在寻找基于application.properties 的解决方案。

有没有办法不用额外的代码来解决这个问题?

【问题讨论】:

【参考方案1】:

当您设置spring.security.user.namespring.security.user.password 时,您将通过spring-security 为整个应用程序配置表单登录,包括Actuator 端点。

不幸的是,在 Spring Boot 2.0 中,您无法使用属性为 Actuator 端点设置不同的用户名/密码或禁用身份验证。这意味着您必须通过安全配置明确允许执行器端点。

通过spring-security,您还可以允许公共访问您的端点并非常容易地要求执行器端点的凭据:

@Configuration
public class BasicSecurityConfig extends WebSecurityConfigurerAdapter 

    public void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
                .antMatchers("/actuator/**").hasRole("ACTUATOR")
                .anyRequest().permitAll();
    

(我假设您使用的是 WebMvc,而不是 WebFlux,这有点不同)

验证您在application.properties 中有以下内容:

spring.security.user.name=user
spring.security.user.password=pass
spring.security.user.roles=ACTUATOR,USER   # and others, if you like

management.endpoint.health.roles=ACTUATOR

请参阅here,了解 Spring 1.x 与 2.0 中的 Actuator 之间的差异。

【讨论】:

当我想要所有其他的 - 这意味着那些不等于 /actuator - 不受保护时,这需要是什么样子? 这个配置就是这样!它仅对以 /actuator 开头的路径需要 ACTUATOR 角色。对于其他一切,它不需要任何凭据。 今天终于有时间试试这个了。不幸的是,当执行器也要求输入密码时,REST 服务仍然受到保护。该类包含在 JAR 中,但显然没有使用/不起作用。使用了我存储在同一个包中的其他带有 @Configuration 注释的类,我可以在 bean 中看到它们。 嗯,您必须确保此配置可作为 bean 使用,否则它将无法工作。我用 2.0.2.RELEASE 对此进行了测试。尝试制作一个准系统项目来验证。 我将如何编写测试来检查身份验证功能?【参考方案2】:

对于 Spring Boot 2.0,当我们覆盖 WebSecurityConfigurerAdapterconfigure 方法时,所有现有的安全性都会回退,我们可以提供自定义安全性。在您的情况下,您只需要对执行器端点进行身份验证,可以按如下方式完成:

@Configuration
public class SecurityConfiguration extends WebSecurityConfigurerAdapter 

    @Override
    protected void configure(HttpSecurity http) throws Exception   
        http.authorizeRequests().antMatchers("/actuator/**").authenticated();
    


application.properties 文件无需更改。

【讨论】:

以上是关于使用用户/密码保护执行器端点,同时授予 RestController 的公共访问权限的主要内容,如果未能解决你的问题,请参考以下文章

Spring boot actuator:当其他执行器的端点受到保护时,健康端点未显示详细信息

linux系统怎么进入root权限

MongoDB用户和密码登录

使用 Laravel Passport 获取经过身份验证的用户并授予密码

使用 Java Spring Rest Api 执行授权码授予流程

具有密码授予类型的 WebClient 的 Spring Security OAuth 客户端不要求新令牌