安全性

本节解决使用 Spring Boot 时的安全性问题,包括使用 Spring Security 与 Spring Boot 时出现的问题。

有关 Spring Security 的更多信息,请参阅 Spring Security 项目页面

关闭 Spring Boot 安全配置

如果您在应用程序中定义了一个带有 SecurityFilterChain bean 的 @Configuration,这个操作会关闭 Spring Boot 中的默认 Web 应用程序安全设置。

更改 UserDetailsService 并添加用户账户

如果您提供了一个类型为 AuthenticationManagerAuthenticationProviderUserDetailsService@Bean,则不会创建 InMemoryUserDetailsManager 的默认 @Bean。 这意味着您可以使用 Spring Security 的全部功能(如 各种身份验证选项)。

添加用户账户的最简单方法是提供您自己的 UserDetailsService bean。

在代理服务器后面运行时启用 HTTPS

确保所有主要端点只能通过 HTTPS 访问是任何应用程序的重要任务。 如果您使用 Tomcat 作为 servlet 容器,那么当 Spring Boot 检测到某些环境设置时,它会自动添加 Tomcat 自己的 RemoteIpValve,允许您依赖 HttpServletRequest 来报告它是否安全(即使在处理实际 SSL 终止的代理服务器下游)。 标准行为由某些请求头(x-forwarded-forx-forwarded-proto)的存在或不存在决定,这些头的名称是约定俗成的,因此它应该可以与大多数前端代理一起工作。 您可以通过在 application.properties 中添加一些条目来打开阀门,如下例所示:

  • Properties

  • YAML

server.tomcat.remoteip.remote-ip-header=x-forwarded-for
server.tomcat.remoteip.protocol-header=x-forwarded-proto
server:
  tomcat:
    remoteip:
      remote-ip-header: "x-forwarded-for"
      protocol-header: "x-forwarded-proto"

(这些属性中的任何一个存在都会打开阀门。 或者,您可以通过使用 WebServerFactoryCustomizer bean 自定义 TomcatServletWebServerFactory 来添加 RemoteIpValve。)

要将 Spring Security 配置为要求所有(或某些)请求使用安全通道,请考虑添加您自己的 SecurityFilterChain bean,该 bean 添加以下 HttpSecurity 配置:

  • Java

  • Kotlin

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
public class MySecurityConfig {

	@Bean
	public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
		// Customize the application security ...
		http.requiresChannel((channel) -> channel.anyRequest().requiresSecure());
		return http.build();
	}

}
import org.springframework.context.annotation.Bean
import org.springframework.context.annotation.Configuration
import org.springframework.security.config.annotation.web.builders.HttpSecurity
import org.springframework.security.web.SecurityFilterChain

@Configuration
class MySecurityConfig {

	@Bean
	fun securityFilterChain(http: HttpSecurity): SecurityFilterChain {
		// Customize the application security ...
		http.requiresChannel { requests -> requests.anyRequest().requiresSecure() }
		return http.build()
	}

}