- 学习Spring Security原理,分析Spring Security的执行流程
Spring Security过滤器链
1、Spring Security过滤器链
- 发起请求
- 用于身份认证的过滤器
- 1、UsernamePasswordAuthentication filter用于处理表单登录
- 2、Basic Authentication filter 用于认证HttpBasic登录
- ...
- 上面的步骤,如果是表单登录那么久出发表单登录过滤器,否则进入Basic过滤器
- 注意:
- 实际应用中过滤器链不止几条,其实有很多条,不配置就不会生效
- 注意:
- ExceptionTranslationFilter 过滤器
- 根据FilerSecurity Interceptor等过滤器抛出来的异常做相应的处理,(例如没有登录,会跳到用户登录界面)
- FilerSecurityInterceptor 过滤器
- 是Spring Security的最后一环
- 经过Spring Security 到达 REST API
- FilerSecurityInterceptor 过滤器
2、Debug断点调试探究Spring Security的执行顺序
- 将Spring Security配置成为表单登录,访问Web,http://127.0.0.1:8080/user
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.formLogin()
.and()
.authorizeRequests()
.anyRequest()
.authenticated();
}
}
- 程序首先进入FilterSecurityInterceptor
- 程序先进入FilterSecurityInterceptor方法,因为没有携带参数,之前的过滤器都不起作用,在该过滤器中决定能否访问后面的内容,在配置中设置为所有的请求都需要进行登录认证,因此在此处会抛出异常
InterceptorStatusToken token = super.beforeInvocation(fi);
- 到达ExceptionTranslationFilter
- 上一步骤中的异常到达ExceptionTranslationFilter这个拦截器中,在这个拦截器中对异常进行处理,处理实则为重定向,跳到默认的登录页面上
* SecurityContextHolderAwareRequestFilter
* FilterChainProxy
* RequestCacheAwareFilter
* DefaultLogoutPageGeneratingFilter
* OncePerRequestFilter
* AbstractAuthenticationProcessingFilter
* LogoutFilter
* HeaderWriterFilter
* SecurityContextPersistenceFilter
* ApplicationFilterChain
* WebAsyncManagerIntegrationFilter
* ...
-
经过一些列Filter,页面被重定向到login页
* 输入用户名和密码
-
到达断点UsernamePasswordAuthenticationFilter
- 拿到用户名和密码
达到断点FilterSecurityInterceptor
* 处理完login跳转到之前/user的请求
* 自定义处理完成后,前端拿到请求的内容