我的shiro之旅: 四 自定义filter

Apache Shiro CVE-2020-1957认证绕过漏洞:原理剖析与实战复现 在Web应用安全中,认证与授权是保护敏感资源的核心机制。其原理通常基于请求路径的匹配与校验,通过安全框架拦截未授权访问。然而,当不同组件对同一请求的路径解析逻辑存在差异时,就会产生严重的安全漏洞,导致认证机制被绕过。这种“解析差异性漏洞”具有极高的技术价值和广泛的现实影响,常出现在Web服务器、安全框架与后端应用框架的协作边界。Apache Shiro作为Java领域广泛使用的安全框架,其CVE-2020-1957漏洞正是此类问题的典型代表。该漏洞源于Shiro的Ant风格路径匹配器与Spring MVC( 阅读详情

博客已移至 http://blog.gogl.top

上一篇文章对shiro的filter作了一些简单的介绍,接一下写写息自定义shiro的filter。使用shiro的时候,比较常用的filter有anon,authc,roles和perms。当我们想定义某个链接是拥有某些权限的用户才可以访问的时候,我们可以这样定义。/xx = roles[A,B]。在shiro中,表示当前用户同时拥有A,B两种角色才可以访问/xx这个链接,是一种&&(与)的关系,我们可以看看源码。在shiro-web-xx.jar的org.apache.shiro.web.filter.authz包下有RolesAuthorizationFilter这样一个类,这个类就是定义roles的filter。

 

public class RolesAuthorizationFilter extends AuthorizationFilter {

    //TODO - complete JavaDoc

    @SuppressWarnings({"unchecked"})
    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {

        Subject subject = getSubject(request, response);
        String[] rolesArray = (String[]) mappedValue;

        if (rolesArray == null || rolesArray.length == 0) {
            //no roles specified, so nothing to check - allow access.
            return true;
        }

        Set<String> roles = CollectionUtils.asSet(rolesArray);
        return subject.hasAllRoles(roles);
    }

}


上面定义了subject.hasAllRoles(roles);就是当前用户必须拥有定义的所有角色才会返回true。但有时候,我们需要当前用户拥有定义的其他一个角色就可以访问,那就需要写自己的filter。也很简单,代码以下:

 

 

public class AnyRolesAuthorizationFilter extends AuthorizationFilter {

	
	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {

		Subject subject = getSubject(request, response);
		String[] rolesArray = (String[]) mappedValue;

		if (rolesArray == null || rolesArray.length == 0) {
			// no roles specified, so nothing to check - allow access.
			return true;
		}

		Set<String> roles = CollectionUtils.asSet(rolesArray);
		for (String role : roles) {
			if (subject.hasRole(role)) {
				return true;
			}
		}
		return false;
	}

}


从上面的代码可以看到,当遍历,发现当前用户拥有定义的其中一个角色就立刻返回true,否则返回false。

 

定义好filter,只需要代码默认的roles即可。

 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/security/login.html" />
		<property name="successUrl" value="/home.html" />
		<property name="unauthorizedUrl" value="/security/unauthorized.html" />
		<property name="filters">
			<map>
				<entry key="anyRoles" value-ref="anyRolesAuthorizationFilter" />
			</map>
		</property>
		<property name="filterChainDefinitions">
			<value>
                                /admin = anyRoles[admin1,admin2]
				/** = anon
			</value>
		</property>
	</bean>

perms的filter也同理。看看源码:

 

 

public class PermissionsAuthorizationFilter extends AuthorizationFilter {

    //TODO - complete JavaDoc

    public boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws IOException {

        Subject subject = getSubject(request, response);
        String[] perms = (String[]) mappedValue;

        boolean isPermitted = true;
        if (perms != null && perms.length > 0) {
            if (perms.length == 1) {
                if (!subject.isPermitted(perms[0])) {
                    isPermitted = false;
                }
            } else {
                if (!subject.isPermittedAll(perms)) {
                    isPermitted = false;
                }
            }
        }

        return isPermitted;
    }
}


自定义的filter:

 

 

public class AnyPermissionsAuthorizationFilter extends AuthorizationFilter {

	@Override
	protected boolean isAccessAllowed(ServletRequest request, ServletResponse response, Object mappedValue) throws Exception {
		Subject subject = getSubject(request, response);
		String[] perms = (String[]) mappedValue;

		for (String perm : perms) {
			if (subject.isPermitted(perm)) {
				return true;
			}
		}
		
		return false;
	}

}


配置使用自定义filter

 

 

<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<property name="loginUrl" value="/security/login.html" />
		<property name="successUrl" value="/home.html" />
		<property name="unauthorizedUrl" value="/security/unauthorized.html" />
		<property name="filters">
			<map>
				<entry key="anyPerms" value-ref="anyPermissionsAuthorizationFilter" />
			</map>
		</property>
		
			<value>
				/admin/add = anyPerms["admin:delete","admin:add"]
				/** = anon
			</value>
		</property>
	</bean>


当用户请求/admin/add时,就会调用自定义的AnyPermissionsAuthorizationFilter来执行。

 

shiro的filter大概讲到这里,相信读者对shiro的filter有更深的认识。
 

Shiro验证绕过漏洞CVE-2020-13933原理剖析与复现指南 在Web应用安全领域,权限验证是保护敏感资源的核心机制。其原理通常基于请求路径的模式匹配,通过过滤器链对特定URL模式实施访问控制。然而,当框架的路径解析逻辑与Servlet容器存在差异时,就可能产生验证绕过漏洞,导致安全防线失效。这类漏洞的技术价值在于揭示了安全框架底层实现与RFC规范协同的重要性。典型的应用场景包括Java Web应用中使用Apache Shiro等安全框架进行权限管理的系统。本文聚焦于CVE-2020-13933,这是一个经典的Shiro验证绕过漏洞,攻击者通过构造包含分号路径参数的请 阅读详情

相关推荐

手机拍照也能玩高光谱?教你用TensorFlow Lite在Android上实现实时RGB转高光谱

本文介绍了如何利用TensorFlow Lite在Android设备上实现实时RGB到高光谱的图像重构技术。通过深度学习模型优化和移动端部署策略,使智能手机具备专业级光谱分析能力,适用于农业检测、化妆品分析等多个领域。

weixin_29091105的博客 247

深入解析Apache Shiro Web集成:从Filter链到安全实战

在Java Web应用开发中,权限控制与安全管理是构建企业级应用的核心基础。其实现原理通常基于Servlet Filter机制,通过在请求处理链中插入安全过滤器,实现对资源的访问控制。这项技术的核心价值在于提供声明式、非侵入式的安全解决方案,能够有效分离业务逻辑与安全检查代码,提升系统的可维护性和安全性。典型的应用场景包括后台管理系统、金融交易平台、企业内部应用等需要细粒度权限控制的Web项目。本文聚焦于Apache Shiro框架的Web集成机制,深入剖析其Filter链设计、Session管理以及安全配

weixin_30655569的博客 330

从零到一:NI USB-8506 LIN通讯的驱动安装与硬件调试全攻略

本文详细介绍了NI USB-8506 LIN通讯设备的驱动安装与硬件调试全流程,包括硬件准备、驱动下载与配置、NI MAX设置及常见问题解决方案。通过实战应用与性能优化技巧,帮助用户快速掌握LIN通讯技术,适用于车载数据记录和自动化测试等场景。

weixin_28273593的博客 924

shiro 重写AuthorizationFilter 让shiro没有权限的时候不重定向,而是执行一个回显操作(初探)

这里在项目需求完成的过程 以前没有权限直接跳转403.html 这样代码非常不灵活 而且前端如果不是html的页面没有权限经常跳不到403的页面 会报一个302的错误 我这里想重写下这个配置后直接跳转到403页面的方式 最好能够返回一段json 这样我前端直接判断json中的数据后前端做跳转到403页面 找了一下shiro中页面重定向的代码是这个AccessControlFilter中的onAc...

qq_43077857的博客 6332

若依开源框架(分离版)在人大金仓数据库下使用

对于甲方业务特殊要求,使用国产化数据库人大金仓,作为项目主要存储。这里以若依开源框架整合人大金仓为例,演示如何在真实项目中引入人大金仓。

🐱喵测实验室 5942

Dify社区版多工作空间功能解锁:源码修改与多租户架构解析

多租户架构是现代SaaS平台实现数据隔离与资源管理的核心技术,其核心原理是通过租户模型将用户、应用和数据在逻辑上隔离。在AI应用开发平台中,这种架构能有效支持多团队、多项目并行开发,确保不同业务线的数据安全与独立迭代。Dify作为开源AI应用构建平台,其底层已设计完善的多租户模型,但社区版默认限制了单用户单工作空间。本文通过精准修改两处关键代码——账户初始化逻辑与系统功能开关,释放了平台固有的多工作空间管理能力。该方案无需改动数据库结构,直接利用现有RBAC权限体系,实现了类似企业版的**多租户隔离**体验

weixin_27059669的博客 1063

SSM项目中自定义Shiro权限过滤器实现多个权限的或操作

我在做ssm+shiro的项目过程中的学习经验,记录一下。

YuFeng_12138的博客 1122

软考高级系统架构设计师历年论文真题深度分析(2011-2025)

本文系统分析了2011-2025年系统架构设计师论文真题,归纳出十大主题类别,包括架构风格、企业集成、数据技术、非功能属性等。研究发现新兴技术占比最高(18.8%),企业集成、数据架构和非功能属性为三大核心考点。论文命题呈现明显技术演进特征,从经典架构理论逐步转向云原生、AI融合等前沿方向。备考建议重点关注高频考点和技术前沿,同时强化场景化解决方案能力。分析表明,架构师考试持续跟踪行业技术发展,注重理论与实践结合,为考生提供了明确的备考方向。

一几文的编程学习笔记。 2047

shiro学习26-shiro提供的filter-AuthorizationFilter类

这个抽象类也是继承自AccessControlFilter。他是用于处理登陆后的权限检查   他有一个属性unauthorizedUrl,表示如果没有对应的权限的话应该调到哪个页面。,这个可以不用配置,但是如果不配置的话默认为空,就会返回一个浏览器默认的401的页面。 看他的子类: ·HostFilter ·PermissionAuthorizationFilter ·PortFi...

iteye_14612的博客 743

计算机视觉教程2-3:图解双线性插值算法&最近邻插值算法

提出此算法的背景是基于图片的缩放,在图片缩放的过程中,实质上就是将原图像像素矩阵像素值,填到目标图像像素矩阵中,目标图像像素矩阵可能比原图像像素矩阵大(图片放大),也可能小(图片缩小)。我们假设图片的宽(WidthWidthWidth)和高(HeightHeightHeight)是按同比例缩放的,那么 srcXsrcWidth=dstXdstWidth\frac{srcX}{srcWidth}= \frac{dstX}{dstWidth}srcWidthsrcX​=dstWidthdstX​ ...

FRIGIDWINTER的博客 7285

面向精准医疗的多模态影像融合:实现前列腺MRI与大病理切片的三维配准与空间重建研究

亲爱的同学,当你能完整实现“前列腺MRI与大病理组织学图像的3D配准及体素重建”,你会发现医学影像交叉领域的毕设课题充满挑战与乐趣。我们将从临床需求出发,拆解3D配准与体素重建的核心技术,带你从原理到代码实现完整流程,让你的毕设不仅能顺利完成,更能体现临床应用价值。,让MRI和病理图像在同一空间对齐,能实现“术前影像-术后病理”的精准关联,为前列腺癌的精准诊疗、预后评估提供关键依据——这一课题既有技术挑战性,又有临床意义,是毕设的优质选择。(如NCC、Dice、配准时间),用数据证明方法的优越性。

m0_71589036的博客 4717

Shiro权限控制(二):自定义Filter

通过自定义Filter实现权限配置,如某个URL需要某个角色的某个权限才能操作

kity9420的专栏 1万+

白话讲解帕累托前沿点(Pareto Frontier)基础知识与实例解析

排除所有“劣解”,缩小决策范围;量化目标间的“权衡关系”(如“每增加1千元成本,续航提升多少小时”);支持不同场景下的个性化选择,平衡冲突目标。无论是手机选购、汽车设计,还是城市规划,帕累托前沿都是从“混乱的多目标”到“清晰的权衡”的关键桥梁,是现代决策科学中不可或缺的工具。通过数学建模,工程很多问题都可以建模成帕累托前沿求解问题,通过线性规划CPLEX、Gurobi 等优化工具,可以方便进行求解。

2138

Shiro过滤器Filter的实战使用

Shiro过滤器Filter的实战使用

a1498665771的博客 1668

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

我的shiro之旅: 三 浅谈shiro的filter

博客已移至 http://blog.gogl.top   前段时间比较懒,项目也有些紧,没有写什么东西。现在再对Shiro做一些整理。上一篇主要介绍了一个完整而又简单的shiro集成到项目的例子,主要是spring项目。这篇文章,想谈一下关于shiro的filter,这需要读者对shiro有一定的理解,至少有用过shiro。   &lt;bean id="shiroFilter" cla...

Dylan的博文 9829

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

我的shiro之旅:自定义filter

1. shiro的filter介绍 Filter Name Class anon org.apache.shiro.web.filter.authc.AnonymousFilter authc org.apache.shiro.web.filter.authc.FormAuthenticationFilter authcBasic org

zhuchunyan_aijia的博客 1万+

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

自定义shiro Filter

=============自定义shiro Filter。解决问题: ==一个action对应多个权限: ====添加分区时,不仅要有分区subArea权限,还要有区域Area的权限。 ===findAll()下拉框选择 分区所属的区域。 ===于是Spring配置shiro:如下: /areaAct...

FrankWeizq的博客 717

spring中 shiro logout 配置方式

有两种方式实现logout 1. 普通的action中 实现自己的logout方法,取到Subject,然后logout 这种需要在ShiroFilterFactoryBean 中配置 filterChainDefinitions 对应的action的url为anon # some example chain definitions: /index.htm = anon /logout = anon /unauthed = anon /console/** = anon /css/** = anon /

m0_67401920的博客 1778

我的shiro之旅: 十五 shiro 登录成功后,跳转到登录前的页面

很多时候,我们需要做到,当用户登录成功后,跳转回登录前的页面。如果用户是点击"登录"链接去到登录页面进行登录的,我们很容易跟踪用户的登录前的页面。比如,在"登录"链接后加一个url参数,如:ht

wangchaoqi1985的博客 2342

### shiro自定义filter【解决某个请求 需要同时拥有多种权限】

=============自定义shiro Filter。解决问题: ==一个action对应多个权限: ====添加分区时,不仅要有分区subArea权限,还要有区域Area的权限。 ===findAll()下拉框选择 分区所属的区域。 ===于是Spring配置shiro:如下: /areaAction_findAll.action = perms["areaAction","s

anyway, life must全力以赴 2872

Shiro 权限基础

Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。本文就带领读者一睹 Shiro 的风采。 可能大家早先会见过 J-security,这个是 Shiro 的前身。在 2009 年 3 月初之前,这个安全框架叫做 J-security,由于某些原因,更名为 Shiro(或者 Ki,意为 Fortress),是 Apache 的孵化项目,鉴于本文编写时 Shiro 的还没有正式发布的版本,

my__shy的博客 575

(39.1) Spring Boot Shiro权限管理【从零开始学Spring Boot】

(本节提供源代码,在最下面可以下载)距上一个章节过了二个星期了,最近时间也是比较紧,一直没有时间可以写博客,今天难得有点时间,就说说Spring Boot如何集成Shiro吧。这个章节会比较复杂,牵涉到的技术点也会比较,如果没有Spring Boot基础的还是建议先学习基础,不然此博客看起来会比较费劲。好了废话不都说了,还是开始我们的Spring Boot Shiro之旅吧。还是依照之前的风格

杜海的博客 1187

Apache Shiro权限绕过漏洞CVE-2020-13933复现与深度解析

权限控制是Web应用安全的核心机制之一,它确保用户只能访问其被授权的资源。其基本原理是通过拦截器或过滤器对请求路径进行匹配和校验,常见的实现方式包括基于角色的访问控制(RBAC)和声明式安全框架。在Java生态中,Apache Shiro作为一个广泛使用的安全框架,提供了身份认证、授权、会话管理等关键功能,其路径匹配逻辑的严谨性直接关系到整个应用的安全边界。CVE-2020-13933漏洞正源于Shiro框架的AntPathMatcher组件在处理特定URL路径时,与后端Servlet容器(如Tomcat)

weixin_29323493的博客 201

将Shiro作为应用的权限基础框架

Shiro 是 JAVA 世界中新近出现的权限框架,较之 JAAS 和 Spring Security,Shiro 在保持强大功能的同时,还在简单性和灵活性方面拥有巨大优势。本文就带领读者一睹 Shiro 的风采。 可能大家早先会见过 J-security,这个是 Shiro 的前身。在 2009 年 3 月初之前,这个安全框架叫做 J-security,由于某些原因,更名为 Shiro(或

攻城狮Luke 786

shiro安全框架

原文:http://blog.youkuaiyun.com/boonya/article/details/8233303   可能大家早先会见过 J-security,这个是 Shiro 的前身。在 2009 年 3 月初之前,这个安全框架叫做 J-security,由于某些原因,更名为 Shiro(或者 Ki,意为 Fortress),是 Apache 的孵化项目,鉴于本文编写时 Shiro 的还没...

weixin_33976072的博客 91
上一篇: 我的shiro之旅: 二 让Shiro保护你的应用
下一篇: 我的shiro之旅: 五 shiro与普通web项目集成
LHacker
博客等级 码龄17年 162粉丝 24原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值