前言

  • 若依(ruoyi): v4.3
  • shiro: 1.5.3
  • 遇坑:shiro 自定义过滤器执行异常,无法排除已允许匿名访问的功能/URL

需求

使用 ruoyi 开发 restful 接口。因此,仅需要ruoyi开放如下功能:

  • swagger-ui.html(为了更好的测试才开放,生产部署时去掉这个)
  • /v2/api-docs(为了更好的测试才开放,生产部署时去掉这个)
  • /api/** (所有的接口均以/api/开头)

除了上述需要开放的功能外,其余均不允许访问。

ruoyi 使用 shiro 进行权限控制。因此需要通过配置 shiro 来达到目的。

操作

实现思路

  • 将所需开放的功能配置为允许匿名访问
  • 将不需要开放的功能均拒绝访问

编写拒绝访问的 shiro 过滤器

public class DenyAllFilter extends PathMatchingFilter {@Overrideprotected boolean onPreHandle(ServletRequest request, ServletResponse response, Object mappedValue) {HttpServletRequest hsr = (HttpServletRequest) request;System.out.println("DenyAllFilter, request is not allow : " + hsr.getRequestURI());return false;}
}

修改 ShiroConfig

/*** Shiro过滤器配置*/@Beanpublic ShiroFilterFactoryBean shiroFilterFactoryBean(SecurityManager securityManager){ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();// Shiro的核心安全接口,这个属性是必须的shiroFilterFactoryBean.setSecurityManager(securityManager);// 自定义过滤器Map<String, Filter> filters = new LinkedHashMap<String, Filter>();filters.put("denyAllFilter", denyAllFilter());shiroFilterFactoryBean.setFilters(filters);// 定义过滤器链LinkedHashMap<String, String> filterChainDefinitionMap = new LinkedHashMap<>();filterChainDefinitionMap.put("/api/**", "anon");filterChainDefinitionMap.put("/v2/api-docs**", "anon");filterChainDefinitionMap.put("/swagger**", "anon");filterChainDefinitionMap.put("/webjars/**", "anon");filterChainDefinitionMap.put("/swagger-resources/**", "anon");filterChainDefinitionMap.put("/favicon.ico**", "anon");filterChainDefinitionMap.put("/**", "denyAllFilter");shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);return shiroFilterFactoryBean;}@Beanpublic DenyAllFilter denyAllFilter(){DenyAllFilter denyAllFilter = new DenyAllFilter();return denyAllFilter;}

嗯…,这就好了。
出了有坑之外,一切都很完美。

有坑

有坑不怕,填上就行。

启动ruoyi,访问地址http://localhost:8085/aswagger-ui.html,得到了个很白的页面。这是遇到坑了。这个坑不分析了,有兴趣的可以参考这里。

说一下结论:

  • 这里遇到的坑是:不该将 filter 交给 spring 创建。

简单解释一下:

  • shiro 的权限控制是通过 filter 控制的,且 shiro 自己维护了一个 filter chain。
  • spring 也维护了一个 filter chain。
  • denyAllFilter 交给 spring 创建后, denyAllFilter 虽然如愿的加入到了 shiro filter chain 中,但,同时也加入到了 spring filter chain 中。

解决办法:
denyAllFilter 不交给 spring 创建即可。将 denyAllFilter 方法前面的 @Bean 注解去掉即可。

    public DenyAllFilter denyAllFilter(){DenyAllFilter denyAllFilter = new DenyAllFilter();return denyAllFilter;}

参考

https://www.cnblogs.com/guitu18/p/12163872.html

【若依(ruoyi)】 Shiro 向 ShiroFilterFactoryBean 中添加自定义过滤器相关推荐

  1. Shiro在SpringBoot中的应用

    Apache Shiro是一个功能强大.灵活的,开源的安全框架.它可以干净利落地处理身份验证.授权.企业会话管理和加密.越来越多的企业使用Shiro作为项目的安全框架,保证项目的平稳运行. 1.数据库 ...

  2. 向DataTable中添加自定义的行

    [标题]向DataTable中添加自定义行 [内容] 向DataTable中添加自定义行,然后绑定到DropDownList控件中,并且默认行为控件的第一行 如果表结构如下:              ...

  3. html怎样添加日历控件,向日历控件中添加自定义内容

    向日历控件中添加自定义内容 String[][] holidays; void Page_Load(Object Sender, EventArgs e) { holidays = new Strin ...

  4. webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...

    文档从网络中收集,已重新整理排版 .word 版本可编辑 . 欢迎下载支持 . 1 word 版本可编辑 . 欢迎下载支持 . 解决在 Web.config 或 App.config 中添 加自定义配 ...

  5. 中的 隐藏鼠标菜单_如何在鼠标右键菜单中添加自定义菜单?工效率提升一倍...

    人都是"懒"的,在使用电脑时,对于常用的操作,步骤太多用久了难免会产生烦躁的情绪,虽然系统已经自带了很多快捷方式,但还是不够用,我们通常都会把常用的东西通过快捷方式来添加到桌面,但 ...

  6. 在Python中添加自定义模块

    一般来说,我们会将自己写的Python模块与python自带的模块分开存放以达到便于维护的目的.那么如何在Python中添加自定义的模块呢? 在解答这个问题之前,我们首先要明确两点: 1.严格区分包( ...

  7. jstl中添加自定义的函数

    转载自   jstl中添加自定义的函数 由于jstl中提供的函数未必能够满足我们的要求,而我们又希望能够像jstl提供的函数那样能够轻松方便使用,那么可以通过自定义函数补充jsltl函数.给jstl添 ...

  8. [转载] 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法

    参考链接: Java重写equals方法 package com.bjpowernode.t01list; import java.util.ArrayList; /* * 向集合中添加自定义类型 * ...

  9. Magento: 在客户账户中添加自定义链接 My Account Add Link

    This extension add new link and a page to that link and enable/disable links in my account left Nav ...

最新文章

  1. dqn在训练过程中loss越来越大_用DQN算法玩FlappyBird
  2. jquery之empty()与remove([expr])区别
  3. 这个开源组织里的项目都是精品
  4. 哈工大c语言作业系统,2015秋C语言程序设计
  5. 记模拟面试日记(更新...)
  6. LINUX SAN 500G重新分区、格式化,后成功恢复数据90%
  7. c primer plus 第七章 第十题
  8. Java基础markdown笔记整理(尚硅谷康师傅)
  9. PS如何进行自定义画笔
  10. sublime 快捷键不能使用
  11. 解决api打开显示“已取消到该网页的导航”问题或者api里面没有内容
  12. HEVC亮度分量帧内预测模式代码详解
  13. 浅谈:机房监控联网报警系统!
  14. 【GStreamer】gstreamer sink中对比度contrast、亮度brightness、饱和度saturation、hue 概念理解
  15. cesium 流动线 发光线(道路线)
  16. Windows10 Docker Desktop启动闪退
  17. oracle行迁移和行链接介绍(两篇文章)
  18. 一个 Web 项目的创建及配置(完整版)
  19. centos下rpm与yum包的安装与卸载
  20. (转)14款开源或免费的GIS软件

热门文章

  1. centos -bash: vim: command not found
  2. 安卓WebView加载网页不显示或者乱跳问题
  3. Eclipse Neon 配置C/C++开发环境
  4. nginx tomcat负载均衡配置
  5. 拷贝的代码中去除行号的方法
  6. 转载 linux内核 asmlinkage宏
  7. hdu 2586 How far away ?
  8. 一起学习 网络规划设计师
  9. 获取webbrowser中元素的屏幕坐标
  10. C# 利用QRCode生成二维码图片