shiro整合swagger的注意事项

 更新时间:2021年05月10日 09:42:25   作者:开发架构二三事  
这篇文章主要介绍了shiro整合swagger需要注意的地方,帮助大家更好的理解和学习使用shiro框架,感兴趣的朋友可以了解下

swagger是一个很好的rest api管理工具,最近又整合了基于shiro的权限控制,出问题了,http://localhost:8080/swagger-ui.html访问不正常,问题肯定是shiro没放行导致的

shiro 配置

在shiroFilter中的配置如下:

@Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //Shiro的核心安全接口,这个属性是必须的
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, Filter> filterMap = new LinkedHashMap<>();
        filterMap.put("authc", new AjaxPermissionsAuthorizationFilter());
        shiroFilterFactoryBean.setFilters(filterMap);
        /*定义shiro过滤链  Map结构
         * Map中key(xml中是指value值)的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的
         * anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种
         * authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter
         */
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
         /* 过滤链定义,从上向下顺序执行,一般将 / ** 放在最为下边:这是一个坑呢,一不小心代码就不好使了;
          authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问 */
        filterChainDefinitionMap.put("/", "anon");
        filterChainDefinitionMap.put("/static/**", "anon");
        filterChainDefinitionMap.put("/login/auth", "anon");
        filterChainDefinitionMap.put("/login/logout", "anon");
        filterChainDefinitionMap.put("/error", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

首先 常规的过滤放行如下:

filterChainDefinitionMap.put("/swagger-ui.html", "anon");
filterChainDefinitionMap.put("/swagger-resources", "anon");
filterChainDefinitionMap.put("/v2/api-docs", "anon");
filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");

重新打开shiro,运行,swagger2页面访问正常,但是程序日志输出依然有权限访问出错

于是继续排查,受限请求如下:

http://localhost:8080/configuration/security
http://localhost:8080/configuration/ui

所以继续添加放行:

filterChainDefinitionMap.put("/configuration/security", "anon");
filterChainDefinitionMap.put("/configuration/ui", "anon");

最终配置为:

@Bean(name = "shiroFilter")
    public ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager) {
        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
        //Shiro的核心安全接口,这个属性是必须的
        shiroFilterFactoryBean.setSecurityManager(securityManager);
        Map<String, Filter> filterMap = new LinkedHashMap<>();
        filterMap.put("authc", new AjaxPermissionsAuthorizationFilter());
        shiroFilterFactoryBean.setFilters(filterMap);
        /*定义shiro过滤链  Map结构
         * Map中key(xml中是指value值)的第一个'/'代表的路径是相对于HttpServletRequest.getContextPath()的值来的
         * anon:它对应的过滤器里面是空的,什么都没做,这里.do和.jsp后面的*表示参数,比方说login.jsp?main这种
         * authc:该过滤器下的页面必须验证后才能访问,它是Shiro内置的一个拦截器org.apache.shiro.web.filter.authc.FormAuthenticationFilter
         */
        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
         /* 过滤链定义,从上向下顺序执行,一般将 / ** 放在最为下边:这是一个坑呢,一不小心代码就不好使了;
          authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问 */
        filterChainDefinitionMap.put("/", "anon");
        filterChainDefinitionMap.put("/static/**", "anon");
        filterChainDefinitionMap.put("/login/auth", "anon");
        filterChainDefinitionMap.put("/login/logout", "anon");
        filterChainDefinitionMap.put("/error", "anon");
        //swagger放行
        filterChainDefinitionMap.put("/swagger-ui.html", "anon");
        filterChainDefinitionMap.put("/swagger-resources", "anon");
        filterChainDefinitionMap.put("/v2/api-docs", "anon");
        filterChainDefinitionMap.put("/webjars/springfox-swagger-ui/**", "anon");
        filterChainDefinitionMap.put("/configuration/security", "anon");
        filterChainDefinitionMap.put("/configuration/ui", "anon");
        filterChainDefinitionMap.put("/**", "authc");
        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
        return shiroFilterFactoryBean;
    }

注意:filterChainDefinitionMap.put("/**", "authc") 需要放置在最后面。

最终结果: 访问http://localhost:8080/api/swagger-ui.html出现

以上就是shiro整合swagger需要注意的地方的详细内容,更多关于shiro整合swagger的资料请关注脚本之家其它相关文章!

相关文章

  • java实现一个接口调取另一个接口(接口一调取接口二)

    java实现一个接口调取另一个接口(接口一调取接口二)

    这篇文章主要介绍了java实现一个接口调取另一个接口(接口一调取接口二),具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-09-09
  • 实例分析Java泛型

    实例分析Java泛型

    本篇文章通过代码实例给大家讲述了Java泛型的相关知识点以及相关的代码分析,对此有兴趣的朋友学习下。
    2018-02-02
  • MyBatis Plus实现一对多的查询场景的三种方法

    MyBatis Plus实现一对多的查询场景的三种方法

    MyBatis Plus提供了多种简便的方式来进行一对多子查询,本文主要介绍了MyBatis Plus实现一对多的查询场景的三种方法,具有一定的参考价值,感兴趣的可以了解一下
    2024-07-07
  • java微信公众号支付示例详解

    java微信公众号支付示例详解

    这篇文章主要为大家详细介绍了java微信公众号支付示例,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • 最优雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企业级应用(附源码)

    最优雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企业级应用(附源码)

    这篇文章主要介绍了最优雅地整合 Spring & Spring MVC & MyBatis 搭建 Java 企业级应用(附源码),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 基于RecyclerChart的KLine的绘制Scale详解

    基于RecyclerChart的KLine的绘制Scale详解

    这篇文章主要为大家详细介绍了基于RecyclerChart实现KLine绘制Scale的相关资料,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-03-03
  • Spring中@Conditional注解的用法

    Spring中@Conditional注解的用法

    这篇文章主要介绍了Spring中@Conditional注解的用法,@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean,需要的朋友可以参考下
    2024-01-01
  • Java中双重检查锁(double checked locking)的正确实现

    Java中双重检查锁(double checked locking)的正确实现

    双重检查锁(Double-Check Locking),顾名思义,通过两次检查,并基于加锁机制,实现某个功能,下面这篇文章主要给大家介绍了关于Java中双重检查锁(double checked locking)的相关资料,需要的朋友可以参考下
    2021-09-09
  • springboot扫码登录的简单实现

    springboot扫码登录的简单实现

    本文主要介绍基于SpringBoot + Vue + Android实现的扫码登录,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java调用Deepseek实现项目代码审查

    Java调用Deepseek实现项目代码审查

    这篇文章主要为大家详细介绍了Java如何调用Deepseek实现项目代码审查功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2025-02-02

最新评论