Spring Security之SecurityFilterChain的选择与执行流程(五)

1.FilterChainProxy去找过滤器链去了~

FilterChain 是过滤器链,我好像之前一直说的拦截器链(尴尬

在上一篇中,我们知道FilterChainProxy 拿到了三条过滤器链,那FilterChainProxy如何根据请求去选择呢?

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3EYxyAGy-1625627158547)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/ce9b8808-24a1-4175-8395-c305f0fecf61/Untitled.png)]

每个SecurityFilterChain都有一个RequestMatcher 匹配器,这个匹配器中可以放置多个url或者通配符表达式进行匹配,匹配成功就直接返回这个过滤器链的过滤器集合。

所以SecurityFilterChain其实也不是过滤器链的真正执行者,而是一个URL匹配器+过滤器集合存储容器的工具人。



2.VirtualFilterChain 接手SecurityFilterChain的过滤器集合

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ufL4ZcYk-1625627158550)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/85ac842b-9345-4a1f-9ead-95ca649dc2ca/Untitled.png)]

研究一下VirtualFilterChain如何形成过滤器链,如何再返回到tomcat的过滤器链上去。毕竟如果security认证或者鉴权通过后,还是要走DispatcherServlet的。

@Override
		public void doFilter(ServletRequest request, ServletResponse response)
				throws IOException, ServletException {
			if (currentPosition == size) {
				// 通过一个指针去遍历过滤器集合
				// 当指针走到集合尾部时,security过滤器链里的过滤器执行完毕
				if (logger.isDebugEnabled()) {
					logger.debug(UrlUtils.buildRequestUrl(firewalledRequest)
							+ " reached end of additional filter chain; proceeding with original chain");
				}

				// Deactivate path stripping as we exit the security filter chain
				this.firewalledRequest.reset();
				// 将请求和响应重新交给tomcat的过滤器链中,security的执行完毕了。
				originalChain.doFilter(request, response);
			} else {
				currentPosition++;
				// 获取security 过滤器链的下一个过滤器
				Filter nextFilter = additionalFilters.get(currentPosition - 1);

				if (logger.isDebugEnabled()) {
					logger.debug(UrlUtils.buildRequestUrl(firewalledRequest)
							+ " at position " + currentPosition + " of " + size
							+ " in additional filter chain; firing Filter: '"
							+ nextFilter.getClass().getSimpleName() + "'");
				}
				// 执行过滤器
				nextFilter.doFilter(request, response, this);
			}
		}

上面的过程其实就是拿出配置的一个个过滤器,然后一个个去执行。



3.小结

下一篇会详细的讲解一下security默认过滤器链中的15个过滤器到底是干啥用的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JKRW10qO-1625627158552)(https://s3-us-west-2.amazonaws.com/secure.notion-static.com/6c66e251-69b3-4b90-a12d-27f1a8f0e446/Untitled.png)]

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

欢谷悠扬

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值