对于最新稳定版本,请使用 Spring Boot 4.0.4spring-doc.cadn.net.cn

安全

本节解答在使用 Spring Boot 时有关安全性的常见问题,包括在 Spring Boot 中使用 Spring Security 所引发的问题。spring-doc.cadn.net.cn

有关 Spring Security 的更多信息,请参阅 Spring Security 项目页面spring-doc.cadn.net.cn

关闭 Spring Boot 安全配置

如果您在应用程序中定义了一个带有 SecurityFilterChain Bean 的 @Configuration,此操作将关闭 Spring Boot 中默认的 Web 应用安全设置。spring-doc.cadn.net.cn

更改 UserDetailsService 并添加用户账户

如果您提供类型为 @BeanAuthenticationManagerAuthenticationProviderUserDetailsService,则不会为 InMemoryUserDetailsManager 创建默认的 @Bean。 这意味着您可以使用 Spring Security 的全部功能集(例如 各种身份验证选项)。spring-doc.cadn.net.cn

添加用户账户最简单的方法是提供您自己的 UserDetailsService Bean。spring-doc.cadn.net.cn

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

确保所有主要端点仅通过 HTTPS 可用,是任何应用程序的一项重要任务。 如果您使用 Tomcat 作为 Servlet 容器,那么当 Spring Boot 检测到某些环境设置时,会自动添加 Tomcat 自带的 RemoteIpValve,使您可以依赖 HttpServletRequest 来报告连接是否安全(即使位于处理实际 SSL 终止的代理服务器之后)。 标准行为取决于是否存在特定的请求头(x-forwarded-forx-forwarded-proto),这些名称是约定俗成的,因此应适用于大多数前端代理。 您可以通过在 application.properties 中添加一些条目来启用该 Valve,如下例所示:spring-doc.cadn.net.cn

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-doc.cadn.net.cn

要配置 Spring Security 以要求所有(或部分)请求使用安全通道,可以考虑添加您自己的 SecurityFilterChain Bean,该 Bean 会添加以下 HttpSecurity 配置:spring-doc.cadn.net.cn

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.Customizer;
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.redirectToHttps(Customizer.withDefaults());
		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.redirectToHttps { }
		return http.build()
	}

}