shiro学习24-shiro提供的filter-AuthenticationFilter

Shiro的AuthenticationFilter是一个抽象类,确保用户已登录。successUrl属性并非成功登录后的跳转地址,而是默认备用地址。实际场景中,如淘宝购物,登录后能返回原页面并保留状态,这是通过在session中保存上次请求信息实现的。在`WebUtils.redirectToSavedRequest()`方法中处理此逻辑。AuthenticationFilter为抽象类,未覆盖onAccessDenied方法,其子类如AuthenticatingFilter和PassThruAuthenticationFilter可能在特定场景下使用,但作者认为与实际生产环境有一定距离。

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

AuthenticationFilter是个抽象类,需要当前用户必须登录。我们看一下他的isAccessAllowed方法:

protectedboolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
        Subject subject = getSubject(request, response);
        returnsubject.isAuthenticated();//判断是否登录。
}

 

 

里面有个successUrl属性,但是这个不是成功登录后跳转的地址,而是一个默认的地址。我们考虑一个在开发中经常用到的场景:我要在淘宝上买东西,在商品详情页输了买10个,但是点击确认后买后却是要求我们登录,然后登录后再跳转到当前的详情页,并且详情页的10依然存在,我之前就好奇他是怎么用一个通用的方法实现的,现在看了shiro的源码有了灵感。他的实现在shirowebutils中,我先透露一下,他是将上一次访问的urlmethod以及queryString放在了session中,然后再登录之后先检查在session中有没有之前放入的值,如果放入了就使用之前的url+method+queryString进行重定向。这里说这些只是说明这个类中的successUrl只是一个默认的,备份的路径,只有没有在session中存放的时候才会跳转到这个路径,他的javadoc上也进行了说明。

 

上面我说的这些在

org.apache.shiro.web.util.WebUtils.redirectToSavedRequest(ServletRequest, ServletResponse, String)方法中说明的,可以在我的博客中WebUtils中查看。

 

回到这个类里面,这个类是个抽象类,而且没有涉及到onAccessDenied方法,所以一定要注意。

我们继续看他的实现类:

·AuthenticatingFilter<!--[endif]-->

·PassThruAuthenticationFilter

其中在AuthenticatingFilter及其子类中我没有找到在实际中可能会用到的场景,我看了源码,但是觉得离实际生产差的很远,所以我没有记笔记,可能是我水平有限吧。

 

 

 

 

 

Shiro (Security Handler Interceptor Object) 是一个开源的身份与访问管理框架,它允许你在Java应用程序中实现安全控制。ShiroFilter 是 Shiro 的核心组件之一,它是一个基于过滤器(Filter)的设计模式,用于处理HTTP请求,实现权限控制、会话管理等功能。 ShiroFilter的工作原理是通过定义一组过滤链(FilterChain),每个过滤器对应特定的安全策略。当请求到达时,Shiro会按照预先配置的顺序执行这些过滤器。如果某个过滤器返回的是`DENY`,则请求会被拒绝;如果是`PERMIT`,则继续下一层过滤器,直到找到`ALLOW`或者过滤链结束。 以下是一个简单的ShiroFilter配置示例: ```xml <filter-chain-manager> <filters> <!-- 其他过滤器配置... --> <filter name="authc" class="org.apache.shiro.web.filter.authc.AuthenticationFilter"> <param name="loginUrl" value="/login"/> </filter> <filter name="logout" class="org.apache.shiro.web.filter.logout.LogoutFilter"> <param name="logoutSuccessUrl" value="/logoutSuccess"/> </filter> <!-- 添加自定义过滤器... --> <filter-chain> <filter-name>customFilter</filter-name> <filter-class>com.example.MyCustomFilter</filter-class> <!-- 可以添加其他filter到此链... --> <filter-ref>authc</filter-ref> <filter-ref>logout</filter-ref> </filter-chain> </filters> <filter-chains> <!-- 定义不同URL的过滤器链... --> <filter-chain id="unprotected" filters="/*"/> <filter-chain id="secured" filters="authc, roles【yourRole】"/> </filter-chains> </filter-chain-manager> ``` 在这个例子中,`/unprotected`路径不需要身份验证,而`/secured`路径需要登录并具有指定角色才能访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值