此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Security 6.3.1Spring中文文档

本节介绍了如何将 Spring Security 与 Spring Boot 一起使用的最低设置,然后向您指出之后的后续步骤。Spring中文文档

完整的入门应用程序可以在我们的示例存储库中找到。 为方便起见,您可以下载由Spring Initializr准备的最小Spring Boot + Spring Security应用程序。Spring中文文档

完整的入门应用程序可以在我们的示例存储库中找到。 为方便起见,您可以下载由Spring Initializr准备的最小Spring Boot + Spring Security应用程序。Spring中文文档

更新依赖项

首先需要将 Spring Security 添加到应用程序的类路径中;两种方法是使用 MavenGradleSpring中文文档

启动 Hello Spring Security 启动

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

运行 Spring Boot 应用程序
$ ./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

...

现在你已经运行了它,你可以尝试点击一个终结点,看看会发生什么。 如果在没有凭据的情况下命中终端节点,如下所示:Spring中文文档

查询安全启动应用程序
$ curl -i http://localhost:8080/some/path
HTTP/1.1 401
...

然后 Spring Security 使用 .401 UnauthorizedSpring中文文档

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

如果您使用凭据(在控制台输出中找到)访问终端节点,如下所示:Spring中文文档

使用凭据进行查询
$ curl -i -u user:8e557245-73e2-4286-969a-ff57fe326336 http://localhost:8080/some/path
HTTP/1.1 404
...

然后 Spring Boot 将为请求提供服务,在这种情况下返回 a,因为不存在。404 Not Found/some/pathSpring中文文档

在这里,您可以:Spring中文文档

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

运行时期望

Spring Boot 和 Spring Security 的默认安排在运行时提供以下行为:Spring中文文档

了解 Spring Boot 如何与 Spring Security 协调以实现这一目标可能会有所帮助。 看一下 Boot 的安全自动配置,它执行以下操作(为了说明而简化):Spring中文文档

Spring 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);
    }
}
  1. 添加批注。(除其他事项外,这会将 Spring Security 的默认过滤器发布为@EnableWebSecurity@Bean)Spring中文文档

  2. 发布一个 UserDetailsService,其中包含 的用户名和随机生成的密码,该密码记录到控制台@BeanuserSpring中文文档

  3. 发布用于发布身份验证事件的 AuthenticationEventPublisher@BeanSpring中文文档

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

安全用例

您可能想从这里去很多地方。 要弄清楚你和你的应用程序的下一步是什么,请考虑 Spring Security 旨在解决的这些常见用例:Spring中文文档

如果这些都不符合您的要求,请考虑按以下顺序考虑您的应用程序:Spring中文文档

  1. 协议:首先,考虑应用程序将用于通信的协议。 对于基于 servlet 的应用程序,Spring Security 支持 HTTP 和 Websocket。Spring中文文档

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

  3. 授权:然后,考虑如何确定用户有权执行的操作Spring中文文档

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