〇、前文回顾在实战篇《手把手教你如何使用SpringSecurity(下):访问控制》我们学习了SpringSecurity强大的访问控制能力,只需要进行寥寥几行的配置就能做到权限的控制,本篇来看看它到底是如何做到的。一、再聊过滤器链源码篇中反复提到,请求进来需要经过的是一堆过滤器形成的过滤器链,走完过滤器链未抛出异常则可以继续访问后台接口资源,而最后一个过滤器就是来判断请求是否有权限继续访问后台资源,如果没有则会将拒绝访问的异常往上向异常过滤器抛,异常过滤器会对异常进行翻译,然后响应给客户端。所以,一般情况下最后一个过滤器是做权限访问控制的核心过滤器FilterSecurityInterce
一、框架原理概述前面源码篇文章(篇尾附上链接)提到,整个框架的核心就是一个过滤器FilterChainProxy,这个过滤器维护了一组过滤器链,真正起作用的其实是这个过滤器里的过滤器链。我们知道过滤器链可是有执行顺序的,关于它是如何排序的,本篇来聊聊。过滤器链实战示例先来看看一个请求进来需要走过的过滤器链有哪些,以下为前面实战篇(篇尾附上链接)中过滤器链debug截图,断点打在核心过滤器FilterChainProxy的doFilter()上,自行走一下代码,会发现请求需要经过如下过滤器:可以看到很多熟悉的过滤器,包括我们自己定义的两个过滤器UserAuthenticationFilter、J
〇、写在前面本篇是基于前两篇Demo进行的登录认证源码流程的讲解,可以先大致看看前两篇,能主动来了解源码,我想对使用SpringSecurity也有一定经验了,肯定能很快熟悉这个Demo,这里附上项目地址:spring-security-demo,以及前两篇博文地址:《手把手教你如何使用SpringSecurity(上):登录授权》《手把手教你如何使用SpringSecurity(中):接口认证》一、登录授权流程前面整体框架设计的源码文章中提到,其实请求进来就是走一条我们配置好的过滤器链,而登录授权这个过滤器(UserAuthenticationFilter)也是过滤器链中的一环,现在我们只关
在看源码的过程中发现用到的设计模式还是很多的,最近博主正好也学习了些设计模式,所以总结了下源码中所用到的设计模式,可能还有很多设计模式没找出来,有兴趣的可以一块来探讨呀。一、责任链模式责任链模式学习请点这里其实接收web请求的整个过滤器链形成的处理方式就是责任链模式。如果想看完整写的责任链模式可以参考:org.springframework.security.web.FilterChainProxy#doFilterInternal方法中定义了一个VirtualFilterChain类型的虚拟过滤器链对象,他的目的主要是更方便的在SpringSecurity过滤器链中传递请求,从它的入口处理和
〇、上篇回顾上篇文章学习了如何通过建造者和配置器创建出核心过滤器springSecurityFilterChain,但也只是个加入Bean容器的对象而已,对于如何在项目中运行起来的,要让我们创建的Filter有效需要将其加入Servlet容器,一起来看看。一、关于SpringBoot中Filter加入Servlet容器的方式在学习如何将核心过滤器加入Servlet容器之前,我们先来了解SpringBoot中添加Filter到Servlet容器的方式。方式一使用@WebFilter注解,@ServletComponentScan所扫描的包路径必须包含该Filter@WebFilter(filte
〇、上篇回顾整个框架的核心就是构建一个名字为springSecurityFilterChain的过滤器,它的类型是FilterChainProxy框架的主要参与者是建造者和配置器,其中WebSecurity和HttpSecurity都是建造者WebSecurity的构建目标是FilterChainProxy对象,即核心过滤器springSecurityFilterChainHttpSecurity的构建目标只是FilterChainProxy对象中一组SecurityFilterChain的一个配置器主要关注init()、configure()方法一、WebSecurityConfigurat
〇、上篇回顾前面文章介绍了整体架构的设计,知道了整个框架由建造者和配置器构成,而各个建造者在前文也已经了解了,本篇来学学配置器,了解其内部的组成成员和功能。一、配置器接口架构整体UML类图展开SecurityConfigurer配置器的顶级接口,定义了init()和configure()接口方法init(Bbuilder):初始化{@linkSecurityBuilder}configure(Bbuilder):配置{@linkSecurityBuilder}必要的属性SecurityConfigurerAdapter{@linkSecurityConfigurer}的子类,init()和co
〇、上篇回顾上一章介绍了整个框架的建造者,其中HttpSecurity也是建造者之一,主要构建目标是FilterChainProxy对象中一组SecurityFilterChain的一个。在实际项目中也是必须用到的类,且功能极多,所以单独拆分一章讲讲其内部各个方法的功能及用法。注:各方法功能说明及示例均来自HttpSecurity源码,如解释不清的时候请参考源码。一、方法列表索引formLogin()openidLogin()headers()cors()sessionManagement()portMapper()jee()x509()rememberMe()authorizeRequest
〇、上篇回顾整个框架的核心就是构建一个名字为springSecurityFilterChain的过滤器,它的类型是FilterChainProxy。WebSecurity和HttpSecurity都是建造者WebSecurity的构建目标是FilterChainProxy对象,即核心过滤器springSecurityFilterChainHttpSecurity的构建目标只是FilterChainProxy对象中一组SecurityFilterChain的一个一、建造者接口架构建造者整体UML图在介绍WebSecurity和HttpSecurity之前我们先来看看它们上层的类和接口。Authe
一、一句话概括框架原理整个框架的核心就是构建一个名字为springSecurityFilterChain的过滤器Bean,它的类型是FilterChainProxy。二、何处开始读源码?思考我们知道,程序入口类会自动扫描当前包及其子包下所有的Bean,并进行实例化,那么在引入一个新的框架,框架中一些定义好的Bean如何注入我们的Spring容器中呢?,这些包并不能被入口类扫描中。其实无非就是通过@Import引入相关的类。一般在使用SpringSecurity框架时,我们会自定义一个配置类,配置类加上@EnableWebSecurity注解,重新启动程序,一个使用了安全框架的项目就起来了,在无
〇、写在前面上两篇讲解了如何做登录授权和接口认证,本篇是实战篇终篇,主要讲讲如何做权限控制,前两篇博文地址:《手把手教你如何使用SpringSecurity(上):登录授权》《手把手教你如何使用SpringSecurity(中):接口认证》同时附上项目地址:spring-security-demo一、理论知识官方介绍SpringSecurityisapowerfulandhighlycustomizableauthenticationandaccess-controlframework.Itisthede-factostandardforsecuringSpring-basedapplicat
一、上篇回顾在手把手教你如何使用SpringSecurity(上):登录授权文章我们配置了如何登录,以及登录后获取JWT令牌,但是对于普通的请求依然无法访问,原因是我们并没有去校验令牌去认证请求的合法性,这一篇就来说说请求的认证。二、接口认证逻辑我们再来捋一下流程,首先用户进行登录授权之后会返回JWT令牌,客户端请求资源接口需要带上这个令牌,而后台要做的就是校验这个令牌的有效性。所以本篇需求也很清晰,校验JWT,其实也是只需要写一个JWT过滤器,将过滤器同上一篇一样的方式配置到过滤器链中。Github项目地址:spring-security-demo,修改记录:JWT认证过滤器和登录时候创建过
一、什么是SpringSecurity?官方介绍SpringSecurityisapowerfulandhighlycustomizableauthenticationandaccess-controlframework.Itisthede-factostandardforsecuringSpring-basedapplications.SpringSecurity是一个功能强大且高度可定制的身份认证和访问控制框架,它是保护基于spring应用程序的事实标准。SpringSecurityisaframeworkthatfocusesonprovidingbothauthenticationan