跳到主要内容

你好,Spring Security

ChatGPT-4o-mini 中英对照 Getting Started Hello Spring Security

本节介绍了如何使用 Spring Boot 配置 Spring Security 的最小设置,然后指引您进行后续步骤。

备注

完成的启动应用程序可以在 我们的示例库 中找到。为了方便您,您可以下载一个最小的 Spring Boot + Spring Security 应用程序 由 Spring Initializr 准备

更新依赖

您首先需要将 Spring Security 添加到您应用程序的类路径中;有两种方法可以做到这一点,分别是 使用 MavenGradle

开始 Hello Spring Security Boot

在类路径上有 Spring Security 的依赖 后,您现在可以 运行 Spring Boot 应用程序。以下代码片段显示了一些输出,指示您的应用程序中已启用 Spring Security:

$ ./mvnw spring-boot:run
...
INFO 23689 --- [ restartedMain] .s.s.UserDetailsServiceAutoConfiguration :

Using generated security password: 8e557245-73e2-4286-969a-ff57fe326336

...
bash

现在您已经成功运行它,您可以尝试访问一个端点,看看会发生什么。如果您像这样访问一个没有凭据的端点:

$ curl -i http://localhost:8080/some/path
HTTP/1.1 401
...
bash

然后 Spring Security 拒绝访问,并返回 401 Unauthorized

提示

如果您在浏览器中提供相同的 URL,它将重定向到默认登录页面。

如果您使用凭据(在控制台输出中找到)访问一个端点,如下所示:

$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 http://localhost:8080/some/path
HTTP/1.1 404
...
bash

然后 Spring Boot 将处理该请求,在这种情况下返回 404 Not Found,因为 /some/path 不存在。

从这里,您可以:

运行时期望

Spring Boot 和 Spring Security 的默认配置在运行时提供以下行为:

理解 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);
}
}
java
  1. 添加 @EnableWebSecurity 注解。 (除了其他功能外,这将 Spring Security 的默认过滤器链 作为 @Bean 发布)

  2. 发布一个 UserDetailsService @Bean,用户名为 user,并生成一个随机密码,该密码会记录到控制台

  3. 发布一个 AuthenticationEventPublisher @Bean 用于发布认证事件

备注

Spring Boot 将任何作为 @Bean 发布的 Filter 添加到应用程序的过滤器链中。这意味着在 Spring Boot 中结合使用 @EnableWebSecurity 会自动为每个请求注册 Spring Security 的过滤器链。

安全使用案例

从这里出发,您可能想去的地方有很多。要弄清楚您和您的应用程序的下一步,考虑以下 Spring Security 旨在解决的常见用例:

如果这些都不符合您的需求,请考虑按照以下顺序思考您的应用程序:

  1. 协议: 首先,考虑您的应用程序将使用什么协议进行通信。对于基于 servlet 的应用程序,Spring Security 支持 HTTP 以及 Websockets

  2. 身份验证: 接下来,考虑用户将如何 进行身份验证,以及该身份验证是有状态的还是无状态的。

  3. 授权: 然后,考虑您将如何确定 用户被授权执行的操作

  4. 防御: 最后,与 Spring Security 的默认保护集成,并考虑 您需要哪些额外的保护