您现在的位置:首页 > >

shiro 使用FormAuthenticationFilter 用于校验用户登录时,所考虑的问题

发布时间:

本人主要说明,在使用shiro filter认证登录时(Authentication)将


subject.login(token);

放在在filter时的用法,源码一



类 AccessControlFilter 中控制访问可以得到,

public boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
return isAccessAllowed(request, response, mappedValue) || onAccessDenied(request, response, mappedValue);
}


?以上得知 如果 || 得知如果第一个false 继续执行 第二个 如果第一个true则返回true。查看isAccessAllowed(request, response, mappedValue) 得知默认实现来自



类AuthenticationFilter 相关代码,
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
Subject subject = getSubject(request, response);
return subject.isAuthenticated();
}


此类(AuthenticationFilter)子类AuthenticatingFilter?中也有相关


isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)

方法的实现类如下。



类AuthenticatingFilter
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
return super.isAccessAllowed(request, response, mappedValue) ||
(!isLoginRequest(request, response) && isPermissive(mappedValue));
}


上图代码得知,以上实现是由父类?AuthenticationFilter实现,其方法默认实现,通过判断subject的?isAuthenticated()返回是否 为true。如果true 就会 导致 onPreHandle 中onAccessDenied 方法无法执行。所以导致问题是


用户A登录后,如果A用户没有登出,恰巧使用浏览器回退按钮返回登录页面使用B用户信息登录时,导致过滤器不被执行。不被执行的原因在于,用户登录验证在类 FormAuthenticationFilter#onAccessDenied()方法实现。


解决方法:


重写父类?isAccessAllowed() 方法,判断是否时登录操作。本文使用FormAuthenticationFilter 中方法 isLoginSubmission 来完成校验。自定义过滤去重写isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue)方法代码如下



@Override
protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) {
if (isLoginSubmission(request, response)) {
return false;
}
return super.isAccessAllowed(request, response, mappedValue);
}


热文推荐
猜你喜欢
友情链接: 医学资料大全 农林牧渔 幼儿教育心得 小学教育 中学 高中 职业教育 成人教育 大学资料 求职职场 职场文档 总结汇报