领先一步
VMware 提供培训和认证,以加快您的进度。
了解更多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
将毫无效果,这被证明是相当误导的。
在 Spring Boot 2.0 中,我们的主要目标是大大简化默认安全配置,并使添加自定义安全变得容易。
为安全提供合理的默认值具有挑战性。我们决定选择最安全的默认值,即保护所有内容,甚至包括公共和静态资源。默认情况下,如果 Spring Security 位于类路径中,Spring Boot 将添加@EnableWebSecurity
,并依赖 Spring Security 的内容协商来决定使用哪种身份验证机制。将提供具有生成的密码的默认用户。
如果 actuator 位于类路径中,相同的默认安全配置也将应用于 actuator 端点。为了防止 actuator 意外泄露敏感数据,大多数 Web 端点默认情况下将被禁用(但是status
和info
默认情况下是启用的)。用户需要采取明确的步骤来启用这些 Web 端点。无论 Spring Security 是否存在于类路径中,此行为都是一致的。
一旦用户决定要添加自定义安全,Spring Boot 提供的默认安全配置将完全后退。此时,用户需要明确定义他们想要保护的所有位。这意味着安全配置现在位于一个位置,并避免了与现有WebSecurityConfigurerAdapter
的任何类型的排序问题。我们提供专门的帮助程序来使您的配置更具可读性和明确性。对于管理端点和静态资源,Spring Boot 提供便利工厂,这些工厂将提供正确的RequestMatcher
。对于管理端点,将根据management.context-path
创建RequestMatcher
。使用RequestMatcher
使用户能够使用现有的 Spring Security 表达式(例如permitAll
、hasRole
等)来保护应用程序。
这是一个自定义安全的示例
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
/status
和/info
端点不需要身份验证。ACTUATOR
角色保护。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 的一部分,我们添加了一个单独的状态端点,该端点仅返回状态。健康端点始终返回完整的健康详细信息。两个端点默认情况下都是安全的,但这使得为这两种情况添加自定义安全规则变得容易得多。