Hello Spring Security
本节介绍如何将 Spring Security 与 Spring Boot 配合使用的最低设置,然后指导你后续步骤。
启动 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 https://127.0.0.1:8080/some/path
HTTP/1.1 401
...
然后 Spring Security 会使用 401 未经授权
拒绝访问。
如果你在浏览器中提供相同的 URL,它会重定向到默认登录页面。 |
如果你使用凭据(在控制台输出中找到)访问端点,如下所示
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 https://127.0.0.1:8080/some/path
HTTP/1.1 404
...
那么 Spring Boot 将为请求提供服务,在这种情况下返回 404 未找到
,因为 /some/path
不存在。
在此,你可以
运行时预期
Spring Boot 和 Spring Security 的默认设置在运行时提供了以下行为
-
要求经过身份验证的用户 访问任何端点(包括 Boot 的
/error
端点) -
在启动时注册一个默认用户,并生成一个密码(密码记录在控制台中;在前面的示例中,密码是
8e557245-73e2-4286-969a-ff57fe326336
) -
使用 BCrypt 以及其他方式 保护密码存储
-
对 基于表单的登录 以及 HTTP Basic 进行身份验证
-
提供内容协商;对于 Web 请求,重定向到登录页面;对于服务请求,返回
401 未经授权
-
缓解 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 的默认Filter
链 作为@Bean
) -
发布一个
UserDetailsService
@Bean
,用户名为user
,随机生成的密码记录到控制台 -
发布一个
AuthenticationEventPublisher
@Bean
以发布身份验证事件
Spring Boot 将任何发布为 @Bean 的 Filter 添加到应用程序的过滤器链中。这意味着在 Spring Boot 中结合使用 @EnableWebSecurity 会自动为每个请求注册 Spring Security 的过滤器链。
|
安全用例
从这里开始,您可以去很多地方。为了弄清楚您和您的应用程序接下来要做什么,请考虑 Spring Security 构建为解决的这些常见用例
-
我正在构建一个 Web 应用程序、API 网关或 BFF,并且
-
我需要 使用 SAML 2.0 登录
-
我需要 使用 CAS 登录
-
我需要管理
-
使用 Spring Data 或使用 JDBC 在 LDAP 或 Active Directory 中的用户
-
如果这些都不符合您的要求,请考虑按以下顺序考虑您的应用程序
-
协议:首先,考虑您的应用程序将用于通信的协议。对于基于 servlet 的应用程序,Spring Security 支持 HTTP 以及 Websocket。
-
身份验证:接下来,考虑用户将如何 进行身份验证,以及该身份验证是有状态还是无状态的
-
授权:然后,考虑您将如何确定 用户被授权做什么
-
防御:最后,与 Spring Security 的默认保护集成,并考虑 您需要哪些其他保护