当前位置: 首页 > 科技观察

一起来学习SpringSecurity过滤链系统

时间:2023-03-12 07:52:51 科技观察

在学习SpringSecurity的时候,你是否有以下两个问题:SpringSecurity登录是如何配置的?SpringSecurity的访问控制机制是什么?上面的两个问题SpringBootWebSecurityConfiguration的答案都在配置类SpringBootWebSecurityConfiguration中。您可以按照下面的思维导图来理解这个自动配置:SpringBootWebSecurityConfiguration为SpringBoot应用程序提供了一组默认的SpringSecurity配置。返回http.build();}这里的配置是:所有请求都必须是经过认证的用户发起的,同时开启表单登录功能和HttpBasicAuthentication认证功能。当我们访问/foo/bar时,需要进行登录认证,可以进行表单登录。此配置有效。这是我们日常开发中需要自定义的,胖哥在HttpSecurity相关文章中也有说明。这个SecurityFilterChain到底是什么?SecurityFilterChain从上面可以看出HttpSecurity是一个构造类,它的任务就是构建一个SecurityFilterChain:publicinterfaceSecurityFilterChain{//当前请求是否匹配booleanmatches(HttpServletRequestrequest);//一组过滤器一个有序的过滤器链,由ListgetFilters();}当请求HttpServletRequest进入SecurityFilterChain时,会使用matches方法判断是否满足条件进入过滤器链。就好比你是VIP,通过VIP通道,就可以享受VIP的一系列待遇;如果您是普通用户,可以走普通用户通道,享受普通用户待遇。无论用户是什么角色,都遵循一个过滤器链,一个应用程序中有1-n条SecurityFilterChain。那么谁来管理多个SecurityFilterChains呢?记住这个公式HttpSecurity->SecurityFilterChain。FilterChainProxyFilterChainProxy是一个GenericFilterBean(即使ServletFilter是一个SpringBean),它管理所有注入到SpringIoC容器中的SecurityFilterChains。刚开始接触SpringSecurity的时候,我是这样配置FilterChainProxy的:过滤链模式="/do/not/filter*"filters="none"/>根据不同的请求路径匹配不同的SecurityFilterChains。下面是示意图:后面会遇到这个类,现在只需要看懂上图就可以了。请注意:不建议在同一个过滤器链中有多个FilterChainProxy实例,也不应该作为一个纯粹的过滤器使用,它应该只承担管理SecurityFilterChain的功能。DelegatingFilterProxyServlet容器和SpringIoC容器之间的Filter生命周期不匹配。为了让SpringIoC容器管理Filter的生命周期,将FilterChainProxy委托给SpringWeb下的DelegatingFilterProxy。而且FilterChainProxy不会对任何添加到applicationcontext的filterbean调用标准的Servlet过滤器生命周期方法,FilterChainProxy的生命周期方法会委托给DelegatingFilterProxy执行。而DelegatingFilterProxy作为SpringIoC和Servlet之间的连接器存在。简单总结一下以上三个概念非常重要,涉及到SpringSecurity的整个过滤链体系。但是作为初学者,能懂多少就懂多少,不懂的不要着急,因为目前学习阶段的水平达不到是很正常的。但是当你学完SpringSecurity之后,你必须理解这些概念。