博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
shiro多Realm第一次调用不生效问题
阅读量:4920 次
发布时间:2019-06-11

本文共 3317 字,大约阅读时间需要 11 分钟。

1. 由于最近自己写的一个项目上用到了多realm的使用,遇到了一个这样的问题:

  1. 自己继承了BasicHttpAuthenticationFilter,实现了获取token,然后直接请求api的方法,但是每次第一次调用的时候都是无效的,第二次请求又是正常的。

以下为配置文件

@Bean    public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager) {        logger.debug("ShiroConfiguration.shiroFilter()");        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();        shiroFilterFactoryBean.setSecurityManager(securityManager);        //拦截器.        Map
filterChainDefinitionMap = new LinkedHashMap
(); // 配置不会被拦截的链接 顺序判断 filterChainDefinitionMap.put("/css/**", "anon"); filterChainDefinitionMap.put("/fonts/**", "anon"); filterChainDefinitionMap.put("/img/**", "anon"); filterChainDefinitionMap.put("/js/**", "anon"); filterChainDefinitionMap.put("/index.html", "anon"); filterChainDefinitionMap.put("/login.html", "anon"); filterChainDefinitionMap.put("/register.html", "anon"); //配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了 filterChainDefinitionMap.put("/auth/logout", "logout"); filterChainDefinitionMap.put("/auth/login", "anon"); filterChainDefinitionMap.put("/wx/app/login/**", "anon"); filterChainDefinitionMap.put("/auth/register", "anon"); //
:这是一个坑呢,一不小心代码就不好使了; //
filterChainDefinitionMap.put("/**", "authc,token"); // 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面 //配置shiro默认登录界面地址,前后端分离中登录界面跳转应由前端路由控制,后台仅返回json数据 shiroFilterFactoryBean.setLoginUrl("/unauth"); // 登录成功后要跳转的链接 shiroFilterFactoryBean.setSuccessUrl("/index"); //未授权界面; shiroFilterFactoryBean.setUnauthorizedUrl("/403"); shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap); Map
filterMap=new HashedMap(); filterMap.put("token",headerHttpAuthenticationFilter()); shiroFilterFactoryBean.setFilters(filterMap); return shiroFilterFactoryBean; }

  2. 贴出主要的配置文件

2.分析问题:

  1. 由于第一次不正常,第二次正常,又因为shiro的权限认证是根据sessionId+过滤器实现的,每次删除sessionId的cookie后,第一次通过token方式进行请求都会出现没有权限的问题。

  2. 检查HeaderHttpAuthenticationFilter类发现正常,在该类中打断点,发现方法能够正常进入到该方法中,并且是正常的

      3. 查询shiro中的Filter调用链,发现ProxiedFilterChain类中是这样进行调用的

   

public void doFilter(ServletRequest request, ServletResponse response) throws IOException, ServletException {        if (this.filters != null && this.filters.size() != this.index) {            if (log.isTraceEnabled()) {                log.trace("Invoking wrapped filter at index [" + this.index + "]");            }            ((Filter)this.filters.get(this.index++)).doFilter(request, response, this);        } else {            if (log.isTraceEnabled()) {                log.trace("Invoking original filter chain.");            }            this.orig.doFilter(request, response);        }    }

  获取filters然后进行一个一个调用,查询以及跟踪断点发现,authc该方式中对应的为BasicHttpAuthenticationFilter

在BasicHttpAuthenticationFilter打上断点

发现每次会请求到该方法上,查找原因发现,由于我是token请求,并没有带该参数导致的

 

问题解决:

  1. 查看ShiroConfig类中发现

filterChainDefinitionMap.put("/**", "authc,token");

  位置放置权限filter鉴权有问题,由于token的鉴权会比authc的权限高,自定义权限比普通的表单认证的优先级高。所以应该将其放到前面,修改为如下

 

filterChainDefinitionMap.put("/**", "token,authc");

  2. 重启项目,运行正常了

转载于:https://www.cnblogs.com/lonecloud/p/10242081.html

你可能感兴趣的文章
js返回上一页并刷新的几种方法
查看>>
POJ 3320 Jessica's Reading Problem 尺取法
查看>>
Unity Json 之三
查看>>
linux java -jar startup.sh
查看>>
DDD的思考
查看>>
类型转换及返回json对象的问题
查看>>
模拟题 找出不能拼凑的最小数
查看>>
ivew实现table的编辑保存追加删除
查看>>
poj 1904(强连通分量+输入输出外挂)
查看>>
Ubuntu重启关机命令使用
查看>>
第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---干净的终止一个线程...
查看>>
shell $() vs ${}
查看>>
实现Serializable的类 的serialVersionUID的作用和生成
查看>>
PHP $_SERVER详解
查看>>
shell脚本大小写转换
查看>>
hdu4699-Editor
查看>>
正则小全
查看>>
Nginx二级目录自动加斜杠
查看>>
iOS开发技巧——关闭Autoresizing开启Autolayout
查看>>
JSP学习笔记(4)-Javabean
查看>>