SpringSecurity6 | 回顾Filter

SpringSecurity6 | 回顾Filter

学习参考 :

1.前言

大家好,我是Leo哥🫣🫣🫣,上一节我们通过一个HelloWorld案例,以代码的方式实现了我们项目添加登录鉴权功能,只是通过一个就轻松实现了这个功能。那么他其中的原理是什么呢,带着疑问,我们后面几节课主要学习一下如何实现这些的原理。好了,话不多说让我们开始吧😎😎😎。

2.遗留问题

  1. 在引入SpringSecurity依赖后,为什么所有请求就需要先做登录认证了呢?
  2. 登录页面是怎么产生的?
  3. 登录页面可以自定义吗?

后面几篇文章,我们会带着这些问题去研究SpringSecurity,并找出问题的答案。

3.请求流程

一个请求发出之后的基本流程是怎么样的呢,我们的请求是如何被拦截的呢,下面我们简单的来看一下流程图。

流程详解:

  1. 客户端通过浏览器或其他方式向服务器发送请求,SpringSecurity会拦截该请求,并将其交给安全过滤器链进行处理。
  2. 安全过滤器链是SpringSecurity 的核心组件,由多个过滤器(Filter) 组成。每个过滤器都有特定的功能,例如身份验证、授权、会话管理等。在处理请求时,安全过滤器链会按照预定义的顺序依次调用各个过滤器,直到最后一个过滤器完成处理。
  3. 身份验证是SpringSecurity中的一个重要功能,它能够验证请求的发起者是否具有访问受保护资源的权限,通常是通过用户名和密码来验证身份。在安全过滤器链中,如果存在身份验证相关的过滤器,则会自动进行身份验证操作,例如UsernamePasswordAuthenticationFilter
  4. 如果请求通过了身份验证和授权操作,SpringSecurity会将请求转发给受保护资源,并返回相应的响应;否则,会返回相应的错误信息或者直接跳转登录页面。

SpringSecurity对于Servlet的支持是基于Servlet Filter的。也就是说SpringSecurity的实现技术手段也是Filter。

4.回顾Filter

4.1过滤器回顾

SpringSecurity 的 Servlet 支持是基于 Servlet Filter 的,因此首先大致了解一下 Filter 的作用是有帮助的。下图显示了单个 HTTP请求的处理程序的典型分层。

客户端向应用程序发送请求,容器创建一个 FilterChain ,其中包含 Filter 实例和应处理 HttpServletRequestDispatcherServlet 的实例。最多一个 Servlet 可以处理单个 HttpServletRequestHttpServletResponse 。然而,多个 Filter 可用于:

  • Prevent downstream Filter instances or the Servlet from being invoked. In this case, the Filter typically writes the HttpServletResponse. 防止调用下游 Filter 实例或 Servlet 。在这种情况下, Filter 通常写入 HttpServletResponse
  • Modify the HttpServletRequest or HttpServletResponse used by the downstream Filter instances and the Servlet. 修改下游 Filter 实例和 Servlet 使用的 HttpServletRequestHttpServletResponse

4.2过滤器核心

vbscript 复制代码
 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
     // do something before the rest of the application
     chain.doFilter(request, response); // invoke the rest of the application
     // do something after the rest of the application
 }

由于 Filter 仅影响下游 Filter 实例和 Servlet ,因此调用每个 Filter 的顺序非常重要。

5.过滤器分类

  1. SecurityContextPersistenceFilter: 该过滤器用来确保在整个请求过程中SecurityContext(安全上下文) 得以保留和传递。SecurityContext主要是用来存储当前用户的身份信息、角色、权限等。
  2. LogoutFilter: 该过滤器用来处理用户注销请求,通常会清除当前用户的身份信息。
  3. UsernamePasswordAuthenticationFilter: 该过滤器用来处理基于用户名和密码的身份认证请求。
  4. RequestCacheAwareFilter: 该过滤器用来缓存请求,以便后续重定向请求时可以正确地恢复请求状态。
  5. ExceptionTranslationFilter: 该过滤器用来处理由AccessDeniedHandler和AuthenticationEntryPoint抛出的异常,将它们转化为合适的HTTP响应。
  6. FilterSecurityInterceptor: 该过滤器用来进行授权操作,决定是否允许用户访问受保护资源。

6.参考文献

7.总结

以上便是本文的全部内容,本人才疏学浅,文章有什么错误的地方,欢迎大佬们批评指正!我是Leo,一个在互联网行业的小白,立志成为更好的自己。

如果你想了解更多关于Leo,可以关注公众号-程序员Leo,后面文章会首先同步至公众号。

相关推荐
Victor3565 小时前
https://editor.csdn.net/md/?articleId=139321571&spm=1011.2415.3001.9698
后端
Victor3565 小时前
Hibernate(89)如何在压力测试中使用Hibernate?
后端
灰子学技术7 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
Gogo8168 小时前
BigInt 与 Number 的爱恨情仇,为何大佬都劝你“能用 Number 就别用 BigInt”?
后端
fuquxiaoguang8 小时前
深入浅出:使用MDC构建SpringBoot全链路请求追踪系统
java·spring boot·后端·调用链分析
毕设源码_廖学姐8 小时前
计算机毕业设计springboot招聘系统网站 基于SpringBoot的在线人才对接平台 SpringBoot驱动的智能求职与招聘服务网
spring boot·后端·课程设计
野犬寒鸦10 小时前
从零起步学习并发编程 || 第六章:ReentrantLock与synchronized 的辨析及运用
java·服务器·数据库·后端·学习·算法
逍遥德10 小时前
如何学编程之01.理论篇.如何通过阅读代码来提高自己的编程能力?
前端·后端·程序人生·重构·软件构建·代码规范
MX_935911 小时前
Spring的bean工厂后处理器和Bean后处理器
java·后端·spring
程序员泠零澪回家种桔子12 小时前
Spring AI框架全方位详解
java·人工智能·后端·spring·ai·架构