SpringSecurity——基本原理
Posted 小志的博客
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSecurity——基本原理相关的知识,希望对你有一定的参考价值。
目录
一、Spring Security的理解
- Spring Security最核心的是过滤器链,也就是一组过滤器(Filter),所有的访问服务的请求都会经过spring security的过滤器,服务的响应也会经过spring security的过滤器再返回给客户端,并且这些过滤器在系统启动时springboot会自动都配置完成。
二、Spring Security基本原理
1、Spring Security基本原理图解
2、spring security核心过滤器
(1)、UsernamePasswordAuthenticationFilter过滤器
- 主要用于处理formLogin表单登录。
- 先检查请求是否是登录请求,并且检查登录请求中是否带有用户名和密码,
- 如果有,这个过滤器就会尝试用这个用户名和密码进行登录,
- 如果没有,就回放过该请求,交给下一个过滤器处理
(2)、BasicAuthenticationFilter过滤器
- 主要用于处理httpBasic登录
- 先检查请求头中是否有basic开头Authentication的信息,
- 如果有,会尝试进行base64解码,然后取出用户名和密码,尝试进行登录
- 如果没有,就回放过该请求,交给下一个过滤器处理
(3)、ExceptionTranslationFilter过滤器
- 用于捕获FilterSecurityInterceptor过滤器抛出的异常。
- ExceptionTranslationFilter 位于FilterSecurityInterceptor过滤器之前的位置。
(4)、FilterSecurityInterceptor过滤器
- 此过滤器是Spring Security的最后一个 Filter,获取当前 request 对应的权限配置,调用访问控制器进行鉴权操作。
- 以上任何一个过滤器成功完成登录后,会在请求上做一个标记,标记认证成功,最后会到FilterSecurityInterceptor过滤器
- FilterSecurityInterceptor是整个spring security过滤器链的最后一环
- FilterSecurityInterceptor后就是我们自己写的controller控制层的REST服务
- FilterSecurityInterceptor决定当前的请求能否访问我们写的REST服务
3、FilterSecurityInterceptor依据什么判断当前的请求能否访问我们写的REST服务
- 根据代码中的配置,即自定义的SecurityConfig配置类中继承WebSecurityConfigurerAdapter类并重写的configure方法中的内容
- configure方法中的内容最终都会放到FilterSecurityInterceptor过滤器中,判断的结果是通过还是不通过
- 如果通过,会跳访问我们写的REST服务
- 如果不通过,会根据具体不能访问的原因抛出对应的异常
4、FilterSecurityInterceptor抛出的异常如何解决
- 通过ExceptionTranslationFilter过滤器来捕获FilterSecurityInterceptor过滤器抛出的异常。
- ExceptionTranslationFilter 位于FilterSecurityInterceptor过滤器之前的位置。
5、总结
- 以上就是spring security最核心的基本原理,spring security提供的所有的功能、特性都是建立在此过滤器链上。
- 比如微信登录、qq登录、短信验证码登录都是在此过滤器链上添加过滤器,来支持不同的身份认证方式
- 在程序实际运行时候,过滤器链上的过滤器不止UsernamePasswordAuthenticationFiletr、BasicAuthenticationFilter、ExceptionTranslationFilter、FilterSecurityInterceptor这四种过滤器,还有其他的过滤器。
三、Spring Security源码解析
1、Spring Security过滤器源码
-
UsernamePasswordAuthenticationFilter过滤器源码解析
-
ExceptionTranslationFilter过滤器源码解析
-
FilterSecurityInterceptor过滤器源码解析
2、启动springboot项目,发送请求,查看过滤器执行顺序
-
创建一个Security配置类,formLogin表单登录的配置,如下图:
-
启动项目,如下图
-
浏览器执行查询请求,如下图:
-
由下图可知,因为不是表单登录,直接执行FilterSecurityInterceptor过滤器,然后执行 ExceptionTranslationFilter过滤器处理FilterSecurityInterceptor过滤器抛出的异常。
-
然后跳转到SpringSecurity表单登录页面,如下图:
-
由下图可知,在SpringSecurity表单登录页面输入用户名和密码,点击登录,先执行UsernamePasswordAuthenticationFilter过滤器,然后执行FilterSecurityInterceptor过滤器,
-
最后输入rest服务输出的结果,如下图:
以上是关于SpringSecurity——基本原理的主要内容,如果未能解决你的问题,请参考以下文章