最近研究shiro这个框架,这个框架的优点就不用说了,每个业务都有登录的过程,今天来探究一下这个登录流程。
首先来理清一下流程,我的是一个web项目,当请求来的时候首先被过滤器拦下,验证token,当token验证通过之后到达controller层。在这个过程中会继承shiro的AuthenticatingFilter
然后在其中重载方法中进行登录逻辑也就是shiro的login()
,执行login之后会进入我们自定义的Realm
中进行token验证。那他是如何走的这一边流程的呢,今天来探究一下。
重写自定义过滤器方法
继承自shiro的AuthenticatingFilter
然后重写其中的三个方法
当请求来的时候首先进入AccessControlFilter
这个类的onPreHandle()
这个方法,这个方法是在进入之前进行一些判断
public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}
首先判断isAccessAllowed()
这个方法,这个方法是验证有没有登录过,如果登录过返回true跳过验证,过滤器放行,没有登录过则进入onAccessDenied()
这个方法进行登录,如果登录成功则过滤器放行,登陆失败则要处理登录失败的逻辑,可以重写onLoginFailure()
方法进行失败逻辑处理,所以自定义的过滤器实现了这两个方法。
这里解释一下,当请求来临时我们都要对token进行验证,所以我们默认判断他为false,然后在onAccessDenied()
这个方法进行登录
@Override
protected boolean onAccessDenied(ServletRequest request, ServletResponse response) throws Exception {
// 获取请求token,如果token不存在,则表示登录失败
String token = getRequestToken((HttpServletRequest) request);
if(StringUtils.isBlank(token)){
// 失败逻辑处理
return false;
}
// executeLogin执行登录 失败则会执行 onLoginFailure
return executeLogin(request, response);
}
父类AuthenticatingFilter查看登录方法
点进executeLogin()
之中会进入AuthenticatingFilter
之中也就是自定义过滤器的父类
protected boolean executeLogin(ServletRequest request, ServletResponse response) throws Exception {
// 获取token
AuthenticationToken token = createToken(request, response);
if (token == null) {
String msg = "异常信息";
throw new IllegalStateException(msg);
}
try {