shiro多Realm第一次调用不生效问题

1. 因为最近本身写的一个项目上用到了多realm的使用,遇到了一个这样的问题:css

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

如下为配置文件前端

    @Bean
    public ShiroFilterFactoryBean shirFilter(org.apache.shiro.mgt.SecurityManager securityManager) {
        logger.debug("ShiroConfiguration.shiroFilter()");
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        //拦截器.
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
        // 配置不会被拦截的连接 顺序判断
        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");
        //<!-- 过滤链定义,从上向下顺序执行,通常将/**放在最为下边 -->:这是一个坑呢,一不当心代码就很差使了;
        //<!-- authc:全部url都必须认证经过才能够访问; anon:全部url都均可以匿名访问-->
        filterChainDefinitionMap.put("/**", "authc,token");
        // 若是不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
        //配置shiro默认登陆界面地址,先后端分离中登陆界面跳转应由前端路由控制,后台仅返回json数据
        shiroFilterFactoryBean.setLoginUrl("/unauth");
        // 登陆成功后要跳转的连接
        shiroFilterFactoryBean.setSuccessUrl("/index");
        //未受权界面;
        shiroFilterFactoryBean.setUnauthorizedUrl("/403");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        Map<String,Filter> filterMap=new HashedMap();
        filterMap.put("token",headerHttpAuthenticationFilter());
        shiroFilterFactoryBean.setFilters(filterMap);
        return shiroFilterFactoryBean;
    }

  2. 贴出主要的配置文件java

2.分析问题:apache

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

  2. 检查HeaderHttpAuthenticationFilter类发现正常,在该类中打断点,发现方法可以正常进入到该方法中,而且是正常的后端

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

   

    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该方式中对应的为BasicHttpAuthenticationFiltercookie

在BasicHttpAuthenticationFilter打上断点session

发现每次会请求到该方法上,查找缘由发现,因为我是token请求,并无带该参数致使的

 

问题解决:

  1. 查看ShiroConfig类中发现

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

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

 

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

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

相关文章
相关标签/搜索