Spring Boot 2.0 M4 的安全更改

工程 | Madhura Bhave | 2017年9月15日 | ...

Spring Boot 2.0 的里程碑 4 为 Spring Boot 提供的安全自动配置带来了重要的更改。

问题陈述

在 Spring Boot 1.x 之前,默认的自动配置使用基本身份验证保护所有应用程序端点。如果 actuator 在类路径中,则会存在一个应用于 actuator 端点的单独安全配置。这两种自动配置的启用和禁用方式完全独立。因此,想要提供自定义安全的用户发现自己与WebSecurityConfigurerAdapter存在排序问题。

此外,对于 actuator 端点,基于 Spring Security 是否在类路径中,management.security.enabled标志的效果非常令人困惑。

security.*management.security.*下有许多属性仅适用于 Spring Boot 提供的自动配置。例如,如果将security.basic.enabled设置为false,则设置security.sessions将毫无效果,这被证明是相当误导的。

2.0 版本的改进

在 Spring Boot 2.0 中,我们的主要目标是大大简化默认安全配置,并使添加自定义安全变得容易。

简化的默认配置

为安全提供合理的默认值具有挑战性。我们决定选择最安全的默认值,即保护所有内容,甚至包括公共和静态资源。默认情况下,如果 Spring Security 位于类路径中,Spring Boot 将添加@EnableWebSecurity,并依赖 Spring Security 的内容协商来决定使用哪种身份验证机制。将提供具有生成的密码的默认用户。

如果 actuator 位于类路径中,相同的默认安全配置也将应用于 actuator 端点。为了防止 actuator 意外泄露敏感数据,大多数 Web 端点默认情况下将被禁用(但是statusinfo默认情况下是启用的)。用户需要采取明确的步骤来启用这些 Web 端点。无论 Spring Security 是否存在于类路径中,此行为都是一致的。

一致的自定义

一旦用户决定要添加自定义安全,Spring Boot 提供的默认安全配置将完全后退。此时,用户需要明确定义他们想要保护的所有位。这意味着安全配置现在位于一个位置,并避免了与现有WebSecurityConfigurerAdapter的任何类型的排序问题。我们提供专门的帮助程序来使您的配置更具可读性和明确性。对于管理端点和静态资源,Spring Boot 提供便利工厂,这些工厂将提供正确的RequestMatcher。对于管理端点,将根据management.context-path创建RequestMatcher。使用RequestMatcher使用户能够使用现有的 Spring Security 表达式(例如permitAllhasRole等)来保护应用程序。

这是一个自定义安全的示例

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()
  ... // additional configuration

  1. /status/info端点不需要身份验证。
  2. 所有其他 actuator 端点都受ACTUATOR角色保护。
  3. 所有用户都可以访问常见的静态资源位置。
  4. 所有其他应用程序端点都受USER角色保护。

我们已将SecurityProperties减少到最低限度,这样就不会对哪些属性仅由自动配置使用以及哪些属性即使在关闭默认安全后也会使用产生混淆。如前所述,Spring Boot 提供具有生成的密码的默认用户。如果要配置自己的用户,可以定义类型为UserDetailsService的 bean,如下所示

@Bean
public UserDetailsService userDetailsService() throws Exception {
    InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
    manager.createUser(User.withUsername("user").password("password")
        .roles("USER").build());
    return manager;
}

您还可以提供自己的AuthenticationManager bean 或AuthenticationProvider bean,然后将使用它们。

其他改进

状态端点

以前,健康端点将根据角色的存在来决定是只返回状态还是公开完整的健康详细信息。始终想要公开完整健康详细信息的用户需要将management.security.flag设置为false,这不太理想,因为它会公开其他 actuator。作为 2.0 的一部分,我们添加了一个单独的状态端点,该端点仅返回状态。健康端点始终返回完整的健康详细信息。两个端点默认情况下都是安全的,但这使得为这两种情况添加自定义安全规则变得容易得多。

获取 Spring 新闻通讯

通过 Spring 新闻通讯保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获得支持

Tanzu Spring在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部