shiro源码-执行shiro过滤器

本文深入探讨Shiro权限认证的内部流程,重点讲解doFilterInternal方法中的preHandle与executeChain执行过程,以及如何通过重写isAccessAllowed方法实现个性化认证。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

接上篇,我们又来到了最关键的doFilterInternal方法中,这一次我们会走AdviceFilter中的doFilterInternal方法。这个方法里面,主要有两句代码,preHandle方法主要作用是判断是否继续执行过滤器的,当返回true时,继续执行过滤器。executeChain方法就是真正执行过滤器了。

preHandle是经常被重写的方法,因为我们认证的个性化配置就是在这个方法里面实现的。在AdviceFilter类里就有这个方法的实现,但是是直接return true,代表所有请求都往下执行,所以没有看的必要,我们看一下它的子类PathMatchingFilter里面的实现吧,如果你不重写这个方法的话,一般都会走这个实现。这个方法里面主要有一个isFilterChainContinued方法和一个appliedPaths属性,但是这个属性的值是怎么来的,我还没搞清楚,就暂且不讨论了,isFilterChainContinued方法还是要看它的具体方法。

isFilterChainContinued方法里面只有一句代码,就是onPreHandle方法的调用,这个方法重写的地方很多,一般要认证的请求会走AccessControlFilter,不需要认证的请求会走AnonymousFilter,AnonymousFilter里面的onPreHandle方法是直接return true,表示直接往下走,所以我们还是来看看AccessControlFilter中的实现吧。

AccessControlFilter中的onPreHandle方法中调用了两个方法,isAccessAllowed和onAccessDenied,一般来讲,isAccessAllowed方法是认证的方法,onAccessDenied方法是认证失败之后的方法。

你完全可以重写这里的isAccessAllowed方法来实现你的个性化认证,shiro默认的实现是AuthenticationFilter中的实现,具体实现是直接取subject中的authenticated参数的值,authenticated为true则认证通过,false则不通过,而authenticated的值在subject创建时就被赋予了。

onAccessDenied默认实现是FormAuthenticationFilter中的实现,具体实现是直接跳到登录页面了。这里值得注意的是,一般前后端分离的项目认证失败后,应该是直接返回认证失败的状态码给前端,所以这个时候必须要重写这个方法,如果不重写的话,前端请求会出现302重定向的错误。

到这里,preHandle方法就算完成调用了,回到上面,当continueChain为true时,表示验证通过,然后执行后面的过滤器,最后到具体的请求地址的方法,返回结果,完成一次请求。当为false时,则表示验证不通过,也就不会往下执行了,直接返回结果了。

另外,这个方法中的postHandle方法,没有默认实现,这个方法表示所有的请求在完成请求,返回请求结果之前的一个操作,如果有需要,可以重写这个方法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值