你好,Spring Security
本节介绍了如何使用 Spring Boot 配置 Spring Security 的最小设置,然后指引您进行后续步骤。
完成的启动应用程序可以在 我们的示例库 中找到。为了方便您,您可以下载一个最小的 Spring Boot + Spring Security 应用程序 由 Spring Initializr 准备。
更新依赖
开始 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
) -
保护 密码存储使用 BCrypt 以及其他方式
-
认证 基于表单的登录 以及 HTTP Basic
-
提供内容协商;对于网页请求,重定向到登录页面;对于服务请求,返回
401 Unauthorized
-
减轻 CSRF 攻击
-
减轻会话固定 攻击
-
写入 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 的默认过滤器链 作为@Bean
发布) -
发布一个 UserDetailsService
@Bean
,用户名为user
,并生成一个随机密码,该密码会记录到控制台 -
发布一个 AuthenticationEventPublisher
@Bean
用于发布认证事件
Spring Boot 将任何作为 @Bean
发布的 Filter
添加到应用程序的过滤器链中。这意味着在 Spring Boot 中结合使用 @EnableWebSecurity
会自动为每个请求注册 Spring Security 的过滤器链。
安全使用案例
从这里出发,您可能想去的地方有很多。要弄清楚您和您的应用程序的下一步,考虑以下 Spring Security 旨在解决的常见用例:
-
我正在构建一个 Web 应用程序、API 网关或 BFF,并且
-
我需要 使用 SAML 2.0 登录
-
我需要 使用 CAS 登录
-
我需要管理
-
在 LDAP 或 Active Directory 中的用户,使用 Spring Data 或 JDBC
-
如果这些都不符合您的需求,请考虑按照以下顺序思考您的应用程序:
-
协议: 首先,考虑您的应用程序将使用什么协议进行通信。对于基于 servlet 的应用程序,Spring Security 支持 HTTP 以及 Websockets。
-
身份验证: 接下来,考虑用户将如何 进行身份验证,以及该身份验证是有状态的还是无状态的。
-
授权: 然后,考虑您将如何确定 用户被授权执行的操作。
-
防御: 最后,与 Spring Security 的默认保护集成,并考虑 您需要哪些额外的保护。