此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Security 7.0.4spring-doc.cadn.net.cn

你好,Spring Security

本节介绍如何将 Spring Security 与 Spring Boot 结合使用的最低配置,然后为你指出后续步骤。spring-doc.cadn.net.cn

完整的入门应用程序可以在我们的示例仓库中找到。 为方便起见,您可以下载一个由 Spring Initializr 准备好的最小化 Spring Boot + Spring Security 应用程序spring-doc.cadn.net.cn

更新依赖项

您首先需要将 Spring Security 添加到应用程序的类路径中;有两种方法可以实现:一种是使用 Maven,另一种是使用 Gradlespring-doc.cadn.net.cn

开始 Hello Spring Security Boot

当 Spring Security 位于类路径上时,你现在可以运行 Spring Boot 应用程序。 以下代码片段展示了一些输出内容,表明 Spring Security 已在你的应用程序中启用:spring-doc.cadn.net.cn

运行 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-doc.cadn.net.cn

查询一个受保护的 Boot 应用程序
$ curl -i http://localhost:8080/some/path
HTTP/1.1 401
...

那么 Spring Security 将以 401 Unauthorized 拒绝访问。spring-doc.cadn.net.cn

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

然后,如果你使用凭证(可在控制台输出中找到)访问一个端点,如下所示:spring-doc.cadn.net.cn

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

那么 Spring Boot 将处理该请求,在此例中由于 404 Not Found 不存在,会返回一个 /some/pathspring-doc.cadn.net.cn

从这里,您可以:spring-doc.cadn.net.cn

运行时期望

Spring Boot 与 Spring Security 的默认配置在运行时提供以下行为:spring-doc.cadn.net.cn

了解 Spring Boot 如何与 Spring Security 协同工作以实现这一点会很有帮助。 查看Boot 的安全自动配置,它执行了以下操作(为便于说明已简化):spring-doc.cadn.net.cn

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. 添加 @EnableWebSecurity 注解。(除其他功能外,这会将 Spring Security 的默认 Filter发布为 @Beanspring-doc.cadn.net.cn

  2. 发布一个 UserDetailsService @Bean,用户名设为 user,并生成一个随机密码输出到控制台spring-doc.cadn.net.cn

  3. 发布一个用于发布认证事件的 AuthenticationEventPublisher @Beanspring-doc.cadn.net.cn

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

安全使用场景

从这里出发,你可能有多个方向可以选择。 为了确定你和你的应用程序接下来该做什么,请考虑以下 Spring Security 旨在解决的常见使用场景:spring-doc.cadn.net.cn

如果以上内容都不符合您的需求,请按照以下顺序思考您的应用程序:spring-doc.cadn.net.cn

  1. 协议:首先,考虑您的应用程序将用于通信的协议。 对于基于 Servlet 的应用程序,Spring Security 支持 HTTP 以及WebSocketspring-doc.cadn.net.cn

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

  3. 授权:然后,考虑你将如何确定用户被授权执行的操作spring-doc.cadn.net.cn

  4. 防御:最后,集成 Spring Security 的默认保护机制,并考虑你需要哪些额外的保护措施spring-doc.cadn.net.cn