Shiro之FormAuthenticationFilter 源码分析

本文深入分析了Shiro中的FormAuthenticationFilter,解释了在SSM整合时为何GET请求无法触发认证流程,并逐步揭示了从doFilter到executeLogin的方法调用过程,包括preHandle、postHandle等关键步骤,以及如何处理登录失败的情况。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

一、简介

ssm application.xml 中配置相关认证过滤器后就会拦截web 请求并自动完成认证功能:

 <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="loginUrl" value="/login" />
		<property name="securityManager" ref="securityManager" />
		<property name="filterChainDefinitions">
			<value>
				/test=authc
				/login=authc
			</value>
		</property>
	</bean>

笔者在实现ssm 和 shiro 整合时登录页面使用了get 请求方式,结果怎么都不会有认证的相关流程,这非常让笔者苦恼,还是翻看了相关源码才知道问题出现的症结。

二、FormAuthenticationFilter

1.既然时servlet 中的 filter 在拦截到请求时一定执行 doFilter 方法。FormAuthenticationFilter 继承体系:

在这里插入图片描述

2.追根溯源OncePerRequestFilter 中发现了doFilter 的方法实现:
在这里插入图片描述
从以上可知,如果一个请求被标识为true,将不会执行过滤器链的doFilter方法,否则将会执行doFilterInternal 方法,设置请求标识为true,最后清除该请求的标识。

3.AdviceFilter 中实现了doFilterInternal 方法:

在这里插入图片描述

以上可知,doFilterInternal 在执行过滤器链doFilter 方法时增加了preHandle、executeChain、postHandle 方法。

在这里插入图片描述

4.PathMatchingFilter 重写preHandle 方法:

在这里插入图片描述

在这里插入图片描述
isEnabled 方法判断当前请求在过滤器链中是否生效

5.AccessControlFilter 重写onPreHandle 方法:

在这里插入图片描述
在这里插入图片描述

分析可知如果访问不被运行则isAccessDenied 方法将被执行

6.AuthenticatingFilter :

executeLogin 方法执行登录操作实现认证:
在这里插入图片描述

重写了finally 中的clearup:
在这里插入图片描述

分析可知:如果是执行认证操作出现异常将会执行onAccessDenied 方法

7.FormAuthenticationFilter 重写了onAccessDenied:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

分析可知:如果是登录请求且是登录操作(请求方法是post),从request 中获取登录参数username、password、rememberMe 参数值,执行登录认证,认证失败将会在request 设置DEFAULT_ERROR_KEY_ATTRIBUTE_NAME 为key,异常类字符串为value;如果是登录操作不是post 请求则过滤器放行;不是登录操作则先保存当前请求并重定向到登录页面。

开发板推荐:天空星STM32F407VET6开发板

超高性价比 STM32主控 | 超高主频 | 一板兼容百芯 | 比赛神器 | 沉金彩色丝印

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值