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——基本原理的主要内容,如果未能解决你的问题,请参考以下文章

SpringSecurity基本原理

[SpringSecurity]基本原理_过滤器链

二Spring Security基本原理

二Spring Security基本原理

Spring Security应用开发(02)基于XML配置的用户登录

Spring Security基本原理