之前我谈了Spring Security安全框架的使用,本篇接着来详解Spring Security原理@mikechen
Spring Security
Spring Security 是一个用于企业级应用程序的安全框架,它提供了一系列的安全机制,包括身份验证、授权、攻击防护等,可以帮助开发人员构建安全可靠的应用程序。
Spring Security作用
Spring Security的主要目标是通过提供一些安全过滤器和认证/授权机制来保护 Web 应用程序,以防止未经授权的访问和攻击。
Spring Security原理
Spring Security的核心原理是使用一系列的过滤器链对请求进行处理,过滤器链是由许多过滤器(Filter)组成的。
在 Spring Security 中,安全过滤器链(SecurityFilterChain)是保护应用程序的核心。
每个 SecurityFilterChain 包含一系列的安全过滤器,这些过滤器负责不同的安全性功能。
比如:用户认证、用户授权、会话管理、跨站点请求伪造防护等等,通过配置多个 SecurityFilterChain,可以对不同的 URL 或者请求进行不同的安全处理。
如下所示:
@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的Filter链拦截。
- 这个Filter链包含了多个Filter,每个Filter都是专门处理某一类安全问题的。例如,UsernamePasswordAuthenticationFilter处理基于用户名和密码的身份验证,LogoutFilter处理退出登录逻辑,等等。
- Filter链中的第一个Filter是通用的SecurityContextPersistenceFilter。它的主要任务是从请求中获取Session信息,并在必要时将它们存储在一个与当前线程关联的安全上下文中。这个上下文中保存了当前用户的身份验证信息、权限信息等。
- 接下来,根据请求的URL和HTTP方法,Filter链中的其他Filter会根据一定的顺序进行执行。这些Filter会根据配置文件中的规则,执行相应的安全处理。例如,如果用户尝试访问一个需要身份验证的资源,UsernamePasswordAuthenticationFilter会负责验证用户的用户名和密码。
- 如果一个Filter验证失败,它将返回一个失败的响应,或者将请求重定向到一个自定义的错误页面。如果验证成功,请求将继续往下传递,直到达到一个允许访问资源的Filter或者被拒绝访问的Filter。
- 如果请求被允许访问,Filter链将把请求传递给应用程序处理。如果请求被拒绝访问,Filter链将返回一个HTTP 403禁止访问的响应。
- 应用程序处理请求之后,Filter链将检查是否需要更新安全上下文。例如,如果用户切换了身份,或者更新了权限信息,Filter链将更新安全上下文。
- 最后,响应将被发送回客户端。
总之,Spring Security通过一系列的过滤器链和安全性相关的核心概念来实现安全性保。
以上就是Spring Security原理详解,更多请查看:Spring Security详解(定义作用及使用实例)
陈睿mikechen
10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。
关注「mikechen」公众号,获取更多技术干货!
后台回复【面试】即可获取《史上最全阿里Java面试题总结》,后台回复【架构】,即可获取《阿里架构师进阶专题全部合集》