你好 Spring Security

本节介绍了如何将 Spring Security 与 Spring Boot 一起使用的最低配置,并指出了后续步骤。

完整的入门应用可在我们的示例仓库中找到。为了方便起见,您可以从Spring Initializr下载一个最小化的 Spring Boot + Spring Security 应用。

更新依赖

您首先需要将 Spring Security 添加到您的应用程序的 classpath 中;有两种方法可以做到:使用 Maven使用 Gradle

启动 你好 Spring Security Boot 应用

将 Spring Security 添加到 classpath 后,您现在可以运行 Spring Boot 应用。以下片段显示了部分输出,表明您的应用中已启用 Spring Security

运行 Spring Boot 应用
  • 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

...

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

查询一个受保护的 Boot 应用
$ 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 的默认配置在运行时提供了以下行为

了解 Spring Boot 如何与 Spring Security 协同工作以实现这些功能会很有帮助。查看Boot 的安全自动配置,它会执行以下操作(为便于说明而简化)

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发布为一个 @Bean

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

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

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

安全用例

接下来您可能会想了解许多方面。要弄清楚您和您的应用程序接下来要做什么,请考虑 Spring Security 旨在解决的这些常见用例

如果以上用例都不符合您的需求,请考虑按以下顺序思考您的应用程序

  1. 协议:首先,考虑您的应用程序将使用哪种协议进行通信。对于基于 Servlet 的应用程序,Spring Security 支持 HTTP 和 Websockets

  2. 认证:接下来,考虑用户将如何认证,以及认证是带状态的还是无状态的

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

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