安全
本节解答了在使用 Spring Boot 时有关安全性的问题,包括将 Spring Security 与 Spring Boot 一起使用时出现的问题。
有关 Spring Security 的更多信息,请参阅 Spring Security 项目页面。
关闭 Spring Boot 安全配置
如果在应用程序中定义了带有 SecurityFilterChain bean 的 @Configuration,此操作将关闭 Spring Boot 中的默认 Web 应用程序安全设置。
更改 UserDetailsService 并添加用户账户
如果提供类型为 AuthenticationManager、AuthenticationProvider 或 UserDetailsService 的 @Bean,则不会创建 InMemoryUserDetailsManager 的默认 @Bean。这意味着您可以使用 Spring Security 的完整功能集(例如各种认证选项)。
添加用户账户最简单的方法是提供自己的 UserDetailsService bean。
在代理服务器后运行启用 HTTPS
确保所有主要端点仅通过 HTTPS 可用是任何应用程序的一项重要任务。如果使用 Tomcat 作为 Servlet 容器,那么 Spring Boot 会在检测到某些环境设置时自动添加 Tomcat 自己的 RemoteIpValve,允许您依赖 HttpServletRequest 来报告它是否安全(即使在处理真实 SSL 终止的代理服务器下游)。标准行为由某些请求头(x-forwarded-for 和 x-forwarded-proto)的存在或缺失决定,它们的名称是约定俗成的,因此它应该适用于大多数前端代理。您可以通过在 application.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,其中添加了以下 HttpSecurity 配置:
-
Java
-
Kotlin
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) {
// 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()
}
}