java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Springboot Shiro anno不启作用

Springboot Shiro anno不启作用问题及解决

作者:Press777

在Shiro配置中遇到静态资源被拦截的问题,通过排除LinkedHashMap过滤次序和将过滤器手动创建而不是注册到容器中解决,同时,确保JwtUtil类也不注册到容器中,以避免请求报Not authorized错误

1. 分析

之前在Shiro中没有配置过静态资源过滤,这次在配置过程中给予静态资源anno发现还是会被拦截,查阅其它文章,基本上都是在说LinkedHashMap 过滤次序问题,但我最初就是这个,因此排除。

后再翻阅相关文章的时候,看到了一位博主在文章中说不要将过滤器注册到容器中即可,自己手动创建过滤器!!

然后查看我的代码,果然将过滤器注册到了容器中,将其拿掉,然后在shiroconfig@Autowired JwtFilter jwtfilter 改成 new JwtFilter()即可。

2. 具体代码

@Bean
    public ShiroFilterChainDefinition shiroFilterChainDefinition() {
        DefaultShiroFilterChainDefinition chainDefinition = new DefaultShiroFilterChainDefinition();
        Map<String, String> filterMap = new LinkedHashMap<>();

        // swagger2页面
        filterMap.put("/swagger-ui.html", "anon");
        filterMap.put("/swagger/**", "anon");
        filterMap.put("/swagger-resources/**", "anon");
        filterMap.put("/v2/**", "anon");
        filterMap.put("/webjars/**", "anon");
        filterMap.put("/webjars.bycdao-ui/**", "anon");
        filterMap.put("/configuration/**", "anon");
        filterMap.put("/doc.html", "anon");

        filterMap.put("/**", "jwt"); // 主要通过注解方式校验权限

        chainDefinition.addPathDefinitions(filterMap);
        return chainDefinition;
    }

    @Bean("shiroFilterFactoryBean")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager,ShiroFilterChainDefinition shiroFilterChainDefinition) {
        ShiroFilterFactoryBean shiroFilter = new ShiroFilterFactoryBean();
        shiroFilter.setSecurityManager(securityManager);
        Map<String, Filter> filters = new HashMap<>();
        // ---------------------------------------------------
        filters.put("jwt", new JwtFilter()); // 修改处
        shiroFilter.setFilters(filters);
        Map<String, String> filterMap = shiroFilterChainDefinition.getFilterChainMap();
        shiroFilter.setFilterChainDefinitionMap(filterMap);
        return shiroFilter;
    }

若在JwtFilter 使用到JwtUtil类判断tk是否过期等,而JwtUtil 同样不要注册到容器中,不然可能请求会报错

Not authorized to invoke method

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文