Shiro之FormAuthenticationFilter 源码分析

一、简介

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

 
		
		
		
			
				/test=authc
				/login=authc
			
		
	

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

二、FormAuthenticationFilter

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

Shiro之FormAuthenticationFilter 源码分析_第1张图片

2.追根溯源OncePerRequestFilter 中发现了doFilter 的方法实现:
Shiro之FormAuthenticationFilter 源码分析_第2张图片
从以上可知,如果一个请求被标识为true,将不会执行过滤器链的doFilter方法,否则将会执行doFilterInternal 方法,设置请求标识为true,最后清除该请求的标识。

3.AdviceFilter 中实现了doFilterInternal 方法:

Shiro之FormAuthenticationFilter 源码分析_第3张图片

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

Shiro之FormAuthenticationFilter 源码分析_第4张图片

4.PathMatchingFilter 重写preHandle 方法:

Shiro之FormAuthenticationFilter 源码分析_第5张图片

Shiro之FormAuthenticationFilter 源码分析_第6张图片
isEnabled 方法判断当前请求在过滤器链中是否生效

5.AccessControlFilter 重写onPreHandle 方法:

Shiro之FormAuthenticationFilter 源码分析_第7张图片
Shiro之FormAuthenticationFilter 源码分析_第8张图片

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

6.AuthenticatingFilter :

executeLogin 方法执行登录操作实现认证:
Shiro之FormAuthenticationFilter 源码分析_第9张图片

重写了finally 中的clearup:
Shiro之FormAuthenticationFilter 源码分析_第10张图片

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

7.FormAuthenticationFilter 重写了onAccessDenied:
Shiro之FormAuthenticationFilter 源码分析_第11张图片
Shiro之FormAuthenticationFilter 源码分析_第12张图片
Shiro之FormAuthenticationFilter 源码分析_第13张图片

Shiro之FormAuthenticationFilter 源码分析_第14张图片

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

你可能感兴趣的:(Shiro)