安全性
本节解答有关使用 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
中添加一些条目来打开阀门,如下例所示:
-
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.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.Customizer
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()
}
}