使用shiro完成了登录验证以及权限的验证,当用户无权限的时候是需要跳转到403也没用,但是我这设置还是没有作用,最终经过排查以及百度加上查看源码解决问题,本篇文章做一个记录。
发现问题
在shiro做权限管理的过程中,用户无权限的时候,是需要跳转到403.html页面的,我在setUnauthorizedUrl也配置的403的跳转了。
但是在实际跳转中死活无法跳转出现如图的问题
Not authorized to invoke method:未授权调用方法。
但是我也设置了未授权界面跳转了啊
那么大概率的问题出现在了setUnauthorizedUrl这个方法上面了,
点击这个方法之后,setUnauthorizedUrl方法就只有赋值
1 | public void setUnauthorizedUrl(String unauthorizedUrl) { |
unauthorizedUrl这个参数是用来干嘛的,通过查找之后除了在setUnauthorizedUrl()这个方法中出现
还出现在了applyUnauthorizedUrlIfNecessary()这个方法中了
1 | private void applyUnauthorizedUrlIfNecessary(Filter filter) { |
通过对源码的一步步追踪,发现在配置配置全局属性applyGlobalPropertiesIfNecessary的方法中会调用applyUnauthorizedUrlIfNecessary方法
1 | //配置全局属性,只要是针对特定类型的Filter配置其所需要的URL属性 |
其他的暂时就不解释了
分析
在applyUnauthorizedUrlIfNecessary方法中有有一个判断,if (StringUtils.hasText(unauthorizedUrl) && filter instanceof AuthorizationFilter)
其中filter必须为AuthorizationFilter类型的过滤器才可以,但是什么类型的过滤器才算是AuthorizationFilter类型的呢,
点击AuthorizationFilter,进入正抽象类中查看它的正常类,得到如图所示
那么红圈中的这些过滤器到底是什么呢?
在配置shiro 过滤器的管理的时候会实例化ShiroFilterFactoryBean
对象
同对代码的跟踪找到createFilterChainManager
这个方法,这个方法是创建过滤器
1
DefaultFilterChainManager manager = new DefaultFilterChainManager();
会将所有默认的过滤器获取到
通过对DefaultFilterChainManager
类的代码跟踪
1 | //添加默认的过滤器 |
DefaultFilter
枚举
1 | public enum DefaultFilter { |
现在知道在抽象类AuthorizationFilter
中红圈的具体类的来源了。
通过对DefaultFilter和AuthorizationFilter
的观察得知
属于AuthorizationFilter
类型的过滤类
- roles(RolesAuthorizationFilter.class),
- perms(PermissionsAuthorizationFilter.class),
- rest(HttpMethodPermissionFilter.class),
- ssl(SslFilter.class),
unauthorizedUrl
会生效。
属于AuthenticationFilter
类型的过滤器
- anon(AnonymousFilter.class),
- authc(FormAuthenticationFilter.class),
- authcBasic(BasicHttpAuthenticationFilter.class),
- logout(LogoutFilter.class),
unauthorizedUrl
不会生效。
解决
现在不跳转的问题找到了,得找解决的办法。
1.对抛出未授权异常UnauthorizedException
进行处理
2.把为AuthenticationFilter
过滤器改为
AuthorizationFilter
过滤器
方法的处理:
1 | /** |
注解的解释:
@ControllerAdvice:异常处理器应用到所有控制器。
@Order(-1):定义组件的加载顺序。值越小拥有越高的优先级。
总结
参考链接:
https://www.iteye.com/blog/jinnianshilongnian-1866350
https://blog.csdn.net/ljz2016/article/details/81214184
https://www.jianshu.com/p/e03f5b54838c