【若依(ruoyi)】 Shiro 向 ShiroFilterFactoryBean 中添加自定义过滤器
前言
- 若依(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 中添加自定义过滤器相关推荐
- Shiro在SpringBoot中的应用
Apache Shiro是一个功能强大.灵活的,开源的安全框架.它可以干净利落地处理身份验证.授权.企业会话管理和加密.越来越多的企业使用Shiro作为项目的安全框架,保证项目的平稳运行. 1.数据库 ...
- 向DataTable中添加自定义的行
[标题]向DataTable中添加自定义行 [内容] 向DataTable中添加自定义行,然后绑定到DropDownList控件中,并且默认行为控件的第一行 如果表结构如下: ...
- html怎样添加日历控件,向日历控件中添加自定义内容
向日历控件中添加自定义内容 String[][] holidays; void Page_Load(Object Sender, EventArgs e) { holidays = new Strin ...
- webconfig的解决方案怎么添加_解决在Web.config或App.config中添加自定义配置的方法详解...
文档从网络中收集,已重新整理排版 .word 版本可编辑 . 欢迎下载支持 . 1 word 版本可编辑 . 欢迎下载支持 . 解决在 Web.config 或 App.config 中添 加自定义配 ...
- 中的 隐藏鼠标菜单_如何在鼠标右键菜单中添加自定义菜单?工效率提升一倍...
人都是"懒"的,在使用电脑时,对于常用的操作,步骤太多用久了难免会产生烦躁的情绪,虽然系统已经自带了很多快捷方式,但还是不够用,我们通常都会把常用的东西通过快捷方式来添加到桌面,但 ...
- 在Python中添加自定义模块
一般来说,我们会将自己写的Python模块与python自带的模块分开存放以达到便于维护的目的.那么如何在Python中添加自定义的模块呢? 在解答这个问题之前,我们首先要明确两点: 1.严格区分包( ...
- jstl中添加自定义的函数
转载自 jstl中添加自定义的函数 由于jstl中提供的函数未必能够满足我们的要求,而我们又希望能够像jstl提供的函数那样能够轻松方便使用,那么可以通过自定义函数补充jsltl函数.给jstl添 ...
- [转载] 向集合中添加自定义类型--建议在自定义类型的时候要重写equals方法
参考链接: Java重写equals方法 package com.bjpowernode.t01list; import java.util.ArrayList; /* * 向集合中添加自定义类型 * ...
- 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 ...
最新文章
- dqn在训练过程中loss越来越大_用DQN算法玩FlappyBird
- jquery之empty()与remove([expr])区别
- 这个开源组织里的项目都是精品
- 哈工大c语言作业系统,2015秋C语言程序设计
- 记模拟面试日记(更新...)
- LINUX SAN 500G重新分区、格式化,后成功恢复数据90%
- c primer plus 第七章 第十题
- Java基础markdown笔记整理(尚硅谷康师傅)
- PS如何进行自定义画笔
- sublime 快捷键不能使用
- 解决api打开显示“已取消到该网页的导航”问题或者api里面没有内容
- HEVC亮度分量帧内预测模式代码详解
- 浅谈:机房监控联网报警系统!
- 【GStreamer】gstreamer sink中对比度contrast、亮度brightness、饱和度saturation、hue 概念理解
- cesium 流动线 发光线(道路线)
- Windows10 Docker Desktop启动闪退
- oracle行迁移和行链接介绍(两篇文章)
- 一个 Web 项目的创建及配置(完整版)
- centos下rpm与yum包的安装与卸载
- (转)14款开源或免费的GIS软件