Spring Security原理详解(8大执行流程机制)

Spring Security原理详解(8大执行流程机制)-mikechen

之前我谈了Spring Security安全框架的使用,本篇接着来详解Spring Security原理@mikechen

Spring Security

Spring Security 是一个用于企业级应用程序的安全框架,它提供了一系列的安全机制,包括身份验证、授权、攻击防护等,可以帮助开发人员构建安全可靠的应用程序。

 

Spring Security作用

Spring Security的主要目标是通过提供一些安全过滤器和认证/授权机制来保护 Web 应用程序,以防止未经授权的访问和攻击。

 

Spring Security原理

Spring Security的核心原理是使用一系列的过滤器链对请求进行处理,过滤器链是由许多过滤器(Filter)组成的。

Spring Security原理详解(8大执行流程机制)-mikechen

在 Spring Security 中,安全过滤器链(SecurityFilterChain)是保护应用程序的核心。

每个 SecurityFilterChain 包含一系列的安全过滤器,这些过滤器负责不同的安全性功能。

比如:用户认证、用户授权、会话管理、跨站点请求伪造防护等等,通过配置多个 SecurityFilterChain,可以对不同的 URL 或者请求进行不同的安全处理。

Spring Security原理详解(8大执行流程机制)-mikechen

如下所示:

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                .authorizeRequests()
                    .antMatchers("/admin/**").hasRole("ADMIN")
                    .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                    .anyRequest().authenticated()
                    .and()
                .formLogin()
                    .and()
                .httpBasic()
                    .and()
                .csrf().disable()
                .build();
    }
    
    @Bean
    public UserDetailsService userDetailsService() {
        InMemoryUserDetailsManager manager = new InMemoryUserDetailsManager();
        manager.createUser(User.withUsername("admin").password("{noop}admin").roles("ADMIN").build());
        manager.createUser(User.withUsername("user").password("{noop}user").roles("USER").build());
        return manager;
    }
}

该 SecurityFilterChain 包含了两个过滤器:

  • org.springframework.security.config.annotation.web.configurers.FormLoginConfigurer,用于配置表单登录,包括登录页面 URL 和成功/失败的处理逻辑;
  • org.springframework.security.config.annotation.web.configurers.HttpBasicConfigurer,用于配置 HTTP 基本认证,该过滤器将在没有提供其他凭据时自动启用。

以上示例中定义的 SecurityFilterChain 可以保证对于 /admin/** 路径的请求,只有拥有 ADMIN 角色的用户才能访问。

而对于 /user/** 路径的请求,只要用户拥有 USER 或 ADMIN 角色就可以访问。

SecurityFilterChain 的作用是对请求进行安全处理,这里的处理包括了对请求进行认证、授权和攻击防护等操作。

 

Spring Security工作流程

Spring Security的执行流程如下:

Spring Security原理详解(8大执行流程机制)-mikechen

  1. 用户请求访问受保护的资源,请求被Spring Security的Filter链拦截。
  2. 这个Filter链包含了多个Filter,每个Filter都是专门处理某一类安全问题的。例如,UsernamePasswordAuthenticationFilter处理基于用户名和密码的身份验证,LogoutFilter处理退出登录逻辑,等等。
  3. Filter链中的第一个Filter是通用的SecurityContextPersistenceFilter。它的主要任务是从请求中获取Session信息,并在必要时将它们存储在一个与当前线程关联的安全上下文中。这个上下文中保存了当前用户的身份验证信息、权限信息等。
  4. 接下来,根据请求的URL和HTTP方法,Filter链中的其他Filter会根据一定的顺序进行执行。这些Filter会根据配置文件中的规则,执行相应的安全处理。例如,如果用户尝试访问一个需要身份验证的资源,UsernamePasswordAuthenticationFilter会负责验证用户的用户名和密码。
  5. 如果一个Filter验证失败,它将返回一个失败的响应,或者将请求重定向到一个自定义的错误页面。如果验证成功,请求将继续往下传递,直到达到一个允许访问资源的Filter或者被拒绝访问的Filter。
  6. 如果请求被允许访问,Filter链将把请求传递给应用程序处理。如果请求被拒绝访问,Filter链将返回一个HTTP 403禁止访问的响应。
  7. 应用程序处理请求之后,Filter链将检查是否需要更新安全上下文。例如,如果用户切换了身份,或者更新了权限信息,Filter链将更新安全上下文。
  8. 最后,响应将被发送回客户端。

总之,Spring Security通过一系列的过滤器链和安全性相关的核心概念来实现安全性保。

以上就是Spring Security原理详解,更多请查看:Spring Security详解(定义作用及使用实例)

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法