此版本仍在开发中,尚不被认为是稳定的。对于最新的稳定版本,请使用 Spring Security 6.5.3! |
你好 Spring Security
本节介绍如何将 Spring Security 与 Spring Boot 一起使用的最低设置,然后指向后续步骤。
完整的入门应用程序可以在我们的示例存储库中找到。 为了您的方便,您可以下载由 Spring Initializr 准备的最小 Spring Boot + Spring Security 应用程序。 |
启动 Hello Spring Security Boot
在类路径上使用 Spring Security,您现在可以运行 Spring Boot 应用程序。 以下代码片段显示了一些输出,指示您的应用程序中启用了 Spring Security:
-
Maven
-
Gradle
-
Jar
$ ./mvnw spring-boot:run
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
$ ./gradlew :bootRun
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
$ java -jar target/myapplication-0.0.1.jar
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :
Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336
...
现在你已经运行了它,你可以尝试点击一个终结点,看看会发生什么。 如果您点击没有凭据的端点,如下所示:
$ curl -i http://localhost:8080/some/path
HTTP/1.1 401
...
然后 Spring Security 使用401 Unauthorized
.
如果您在浏览器中提供相同的 URL,它将重定向到默认登录页面。 |
如果您点击具有凭据(在控制台输出中找到)的端点,如下所示:
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 http://localhost:8080/some/path
HTTP/1.1 404
...
则 Spring Boot 将为请求提供服务,并返回一个404 Not Found
在这种情况下,因为/some/path
不存在。
在这里,您可以:
运行时预期
Spring Boot 和 Spring Security 的默认排列在运行时提供以下行为:
-
任何端点都需要经过身份验证的用户(包括 Boot 的
/error
端点) -
在启动时使用生成的密码注册默认用户(密码记录到控制台;在前面的示例中,密码为
8e557245-73e2-4286-969a-ff57fe326336
) -
对基于表单的登录和 HTTP Basic 进行身份验证
-
提供内容协商;对于 Web 请求,重定向到登录页面;对于服务请求,返回一个
401 Unauthorized
-
缓解 CSRF 攻击
-
缓解会话固定攻击
-
写入 Strict-Transport-Security 以确保 HTTPS
-
编写 X-Content-Type-Options 以缓解嗅探攻击
-
写入保护经过身份验证的资源的缓存控制标头
-
编写 X-Frame-Options 以缓解点击劫持
了解 Spring Boot 如何与 Spring Security 协调以实现此目的会很有帮助。 看看 Boot 的安全自动配置,它会执行以下作(简化以示说明):
@EnableWebSecurity (1)
@Configuration
public class DefaultSecurityConfig {
@Bean
@ConditionalOnMissingBean(UserDetailsService.class)
InMemoryUserDetailsManager inMemoryUserDetailsManager() { (2)
String generatedPassword = // ...;
return new InMemoryUserDetailsManager(User.withUsername("user")
.password(generatedPassword).roles("USER").build());
}
@Bean
@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
DefaultAuthenticationEventPublisher defaultAuthenticationEventPublisher(ApplicationEventPublisher delegate) { (3)
return new DefaultAuthenticationEventPublisher(delegate);
}
}
-
添加
@EnableWebSecurity
注解。(除其他外,这发布了Spring Security 的默认值Filter
链作为@Bean
) -
发布一个
UserDetailsService
@Bean
用户名为user
以及记录到控制台的随机生成的密码 -
发布一个
AuthenticationEventPublisher
@Bean
用于发布身份验证事件
Spring Boot 将任何Filter 发布为@Bean 到应用程序的筛选器链。
这意味着使用@EnableWebSecurity 与 Spring Boot 结合使用,会自动为每个请求注册 Spring Security 的过滤器链。 |
安全用例
您可能想从这里去很多地方。 要弄清楚您和您的应用程序的下一步是什么,请考虑 Spring Security 旨在解决的以下常见用例:
-
我正在构建一个 Web 应用程序、API 网关或 BFF,并且
-
我需要管理
-
LDAP 或 Active Directory 中的用户,使用 Spring Data 或 JDBC
-
如果这些都不符合您要查找的内容,请考虑按以下顺序考虑您的应用程序:
-
协议:首先,考虑您的应用程序将用于通信的协议。 对于基于 servlet 的应用程序,Spring Security 支持 HTTP 和 Websockets。
-
身份验证:接下来,考虑用户将如何进行身份验证,以及该身份验证是有状态的还是无状态的
-
授权:然后,考虑如何确定用户有权执行的作
-
防御:最后,与 Spring Security 的默认保护集成,并考虑您需要哪些额外的保护