一、简介
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 请求则过滤器放行;不是登录操作则先保存当前请求并重定向到登录页面。
本文深入分析了Shiro中的FormAuthenticationFilter,解释了在SSM整合时为何GET请求无法触发认证流程,并逐步揭示了从doFilter到executeLogin的方法调用过程,包括preHandle、postHandle等关键步骤,以及如何处理登录失败的情况。

4万+

被折叠的 条评论
为什么被折叠?



