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)]

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
Spring Security和JWT(JSON Web Token)结合起来实现单点登录的执行流程如下: 1. 用户登录:用户通过提供用户名和密码进行身份验证,后台用户的凭据是否。 2. 颁发JWT如果用户的凭据验证通过,后台将颁发一个JWT给用户。JWT包含了用户的身份信息和其他必要的数据。 3. 将JWT发送给客户端:后台将JWT发送给客户端,通常是通过在响应的头部或者响应的主体中添加JWT。 4. 客户端保存JWT:客户端接收到JWT后,通常会将其保存在本地,例如在浏览器的本地存储或者cookie中。 5. 客户端发送JWT:当客户端发送请求到其他需要认证的资源服务器时,它会在请求的头部或者请求的主体中添加JWT。 6. 验证JWT:资源服务器接收到请求后,会从请求中提取JWT,并对其进行验证。验证包括检查JWT的签名是否有效、是否过期以及其他自定义的验证规则。 7. 授权访问:如果JWT验证通过,资源服务器将授权客户端访问受保护的资源。这可以通过在响应中返回所需的数据或者访问令牌来实现。 8. 重复以上步骤:客户端可以使用相同的JWT访问其他受保护的资源,只需要在每个请求中添加JWT即可。 需要注意的是,这只是一个简化的流程,实际的单点登录流程可能会根据具体的系统需求有所不同。此外,还需要考虑JWT的安全性,例如对JWT的签名进行保护,防止篡改和伪造。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值