开篇
通过上述 4 篇实战文章的讲解, 我们了解了 Spring Security
的基本用法.
本文我会基于对 Spring Security
内部实现原理的理解, 来实现一个 “破产版” 的 Spring Security
. 源码地址请参考 mini-security-starter.
写这个的目的是便于读者理解 Spring Security
的 大致思想 , 具体的编码实现不会用到设计模式, 也不会遵循严格的编码规范 或 设计原则. 产出的源码更并不能用于实际开发工作之中.
本文内容全部基于 spring-boot-2.3.2.RELEASE
.
正文
一、如何 web 应用的认证和鉴权
看到这个标题, 我们很快能想到一个叫 Filter
(过滤器) 的东西, 基于 Filter
我们可以很轻松达到我们的目的, 不管是 servlet
、Springmvc
、还是 Springboot
应用.
当一个请求到服务端时, 就产生了如下图所示的请求链路.
二、简单回顾一下 Spring Security 的使用
通过前面的系列实战文章, 我们知道, 当我们引入 Spring Security
依赖后, 通过添加如下的配置类, 就能定制化实现我们的各种 认证 和 鉴权 的需求.
@Component
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
// 访问 api/hello 需要认证
http.antMatcher("/api/**").authorizeRequests()
.antMatchers("/api/hello").authenticated();
// 表单登陆
http.formLogin();
// http basic 认证
http.httpBasic();
}
}
当我学到这里时, 我产生了如下的疑问:
- 明面上看, 这个配置跟
Filter
半毛钱关系都没有. 那么它到底怎么起到过滤器的作用的. - Spring 为 Spring Security 预留了什么扩展点, 能让两者完美融合.
三、简述 Spring Security 实现原理
当 Springboot 应用启动时,
- Spring 会加载
WebSecurityConfigurerAdapter
的所有实现类, 比如上述的WebSecurityConfig
, 然后放到一个List
集合中. - 依次执行
WebSecurityConfigurerAdapter#configure(HttpSecurity http)
方法, 获取到一个个DefaultSecurityFilterChain
对象.
- 先看下 DefaultSecurityFilterChain 大致长什么样子.
public class DefaultSecurityFilterChain {