java代码审计-Shiro认证授权

news/2025/9/29 22:08:05/文章来源:https://www.cnblogs.com/kudo4869/p/19119631

java代码审计 Shiro认证授权部分

前言:

这两天发现自己读shiro权限这块有点忘了,于是再好好学一遍shiro,然后结合实战代码审计记录练下

1.Shiro 核心组件

shiro中的权限定义:用户,角色,权限 ,如图所示

image-20250927214154522

1、UsernamePasswordToken,Shiro 用来封装用户登录信息,使用用户的登录信息来创建令牌 Token。

2、SecurityManager,Shiro 的核心部分,负责安全认证和授权。

3、Suject,Shiro 的一个抽象概念,包含了用户信息。

4、Realm,开发者自定义的模块,根据项目的需求,验证和授权的逻辑全部写在 Realm 中。

5、AuthenticationInfo,用户的角色信息集合,认证时使用。(来认证看你是什么角色)

6、AuthorzationInfo,用户的权限信息集合,授权时使用(角色拥有什么权限)

7、DefaultWebSecurityManager,安全管理器,开发者自定义的 Realm 需要注入到此进行管理

8、ShiroFilterFactoryBean,过滤器工厂,Shiro的基本运行机制是开发者定制规则,Shiro去执行具体的执行操作

image-20250927215214964

整个过程:首先用户登录,UsernamePasswordToken封装创建token,然后去找Suject查用户信息,接着又SecurityManager负责认证和授权,他会利用到AuthenticationInfo,AuthorzationInfo进行权限和角色的授权

2.Shiro配置

shiro中Realm是用户自己写的模块用来完成,首先来看到ShiroRealm的编写,需要继承抽象类AuthorizingRealm

两个抽象方法必须实现 doGetAuthenticationInfodoGetAuthorizationInfo,这两个方法这样理解,(如果你是admin登录,doGetAuthenticationInfo就是校验你是不是admin,doGetAuthorizationInfo给你的admin账户授权,你的角色和权限)

先来看doGetAuthenticationInfo(用来校验用户正确性,未整合JWT的写法,也就是用账号密码认证)

整个思路是,用户输入的账号密码会封装到AuthenticationToken中,我们取了之后使用用户登录的账号去数据库查询出正确的密码。接着返回SimpleAuthenticationInfo(携带正确的凭证,在这里是密码),其带有了正确的密码会使用默认的CredentialsMatcher()去对比是否正确,然后用户是否正确

image-20250928175022437

image-20250928180521240

ShiroConfig的配置

需要将realm注入到securityManager中

再把securityManager注入ShiroFilterFactoryBean

image-20250928214744065

在ShiroFilterFactoryBean中实现对权限的设置

image-20250928200143917

接着回到实现权限认证的另一个类doGetAuthorizationInfo,这里是通过在数据库中设置对应的perms和roles的值来代表对应的权限和角色。通过Subject拿到用户信息然后设置对应权限角色

image-20250928214117785

3.实际项目

项目地址:https://github.com/jeecgboot/JeecgBoot

shiro整合JWT的写法(也就是用jwttoken认证代替密码认证)

优点:

  1. 实现 “无状态认证”,适配分布式与微服务架构

  2. 减轻服务端存储与性能压力

  3. ...

也是看到doGetAuthenticationInfo。这里和上面不同的是自定义的函数checkUserTokenIsEffect完成了token的校验。SimpleAuthenticationInfo中传入的token自然也是正确的凭证,也就是没有使用shiro自带的校验功能

image-20250928180150468

所以其实这里可以自定义CredentialsMatcher跳过传统的比对逻辑,但是项目中没写也不碍事

public class JwtCredentialsMatcher implements CredentialsMatcher {@Overridepublic boolean doCredentialsMatch(AuthenticationToken token, AuthenticationInfo info) {// 由于JWT在Realm中已经验证过有效性,这里直接返回true,表示“凭证匹配”return true;}
}

通过实现接口来实现jwt

image-20250928180826184

checkUserTokenIsEffect:如何校验jwt,其实和jwt的原理差不多

主要是这三部,获取用户,然后查询正确的用户信息,然后调用jwtTokenRefresh校验用户是否正确

image-20250928181353211

getLoginUser()查询中会存在一个aes解密,因为数据库进行了aes加密。保证数据安全

image-20250928181556304

ShiroConfig的设置

再把securityManager注入ShiroFilterFactoryBean

image-20250928195005268

配置无需登录即可访问的url

image-20250929120303871

这里添加的过滤器主要是对跨域的支持

image-20250929120538616

在securityManager注入Realm,禁用 Shiro 的会话(Session)存储功能,并配置 Redis 作为缓存管理器,适配无状态认证场景(如 JWT 认证)

@Bean("securityManager")
public DefaultWebSecurityManager securityManager(ShiroRealm myRealm) {DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();securityManager.setRealm(myRealm);/** 关闭shiro自带的session,详情见文档* http://shiro.apache.org/session-management.html#SessionManagement-* StatelessApplications%28Sessionless%29*/DefaultSubjectDAO subjectDAO = new DefaultSubjectDAO();DefaultSessionStorageEvaluator defaultSessionStorageEvaluator = new DefaultSessionStorageEvaluator();defaultSessionStorageEvaluator.setSessionStorageEnabled(false);subjectDAO.setSessionStorageEvaluator(defaultSessionStorageEvaluator);securityManager.setSubjectDAO(subjectDAO);//自定义缓存实现,使用redissecurityManager.setCacheManager(redisCacheManager());return securityManager;
}

接着把这整个项目的登录认证授权捋一遍

首先在登录接口输入账号密码后,查询是否存在登录的此用户,如果存在则用户开始密码匹配,每个账户也存在一个加密盐,然后将密码通过PBEWITHMD5andDES算法加密与数据库比对,相同则代表登录成功

image-20250929130610084

登录成功后生成token,这里生成jwt使用的算法是HMAC256,secret为该账户的密码,然后传回前端,即前端就有了这个凭证

image-20250929130825359

登录成功后前端会访问/getUserinfo这个接口带上刚刚返回给前端的token。被jwtfilter拦截。判断当前路径是否有@IngoreAuth路径。然后调用executeLogin()

image-20250929131154643

注解@IgnoreAuth的配置

image-20250929131249362

然后会交给realm登入认证

image-20250929131402102

image-20250929131457285

我们可以重点看看这个自定义的类是如何校验的

checkUserTokenIsEffect:如何校验jwt,其实和jwt的原理差不多

首先也是获取正确的用户,不过如果是从redis中获取的话会经过aes解密,也就是redis中的数据是由aes加密过的,逻辑在handlerObject中

image-20250929131959962

调用jwtTokenRefresh也就是主要的token判断是否合理

image-20250929132155787

这段代码首先从redis中取出token(经过认证后存入的token),发现如果存在token,有效性有问题也刷新。算一个小漏洞,不过危害程度很低,如果攻击者能获取到某用户(如admin用户)的token即使过期,仍然可以利用普通用户的账号密码登录加此admin用户的token伪造高权限。权限维持。因为传入的账号密码是正确的账号密。漏洞利用的条件:某用户token(在redis中)即可

    private static boolean jwtTokenRefresh(String token, String userName, String passWord, RedisUtil redisUtil) {String cacheToken = oConvertUtils.getString(redisUtil.get(CommonConstant.PREFIX_USER_TOKEN + token));if (oConvertUtils.isNotEmpty(cacheToken)) {// 校验token有效性if (!JwtUtil.verify(cacheToken, userName, passWord)) {String newAuthorization = JwtUtil.sign(userName, passWord);// 设置Toekn缓存有效时间redisUtil.set(CommonConstant.PREFIX_USER_TOKEN + token, newAuthorization);redisUtil.expire(CommonConstant.PREFIX_USER_TOKEN + token, JwtUtil.EXPIRE_TIME * 2 / 1000);}return true;}return false;}

当访问需要鉴权的接口时会调用doGetAuthorizationInfo授权,也是从数据库中取对应的角色权限赋值来。

image-20250929150839718

如访问某个接口需要什么权限如下即可

    @PostMapping(value = "/add")@RequiresPermissions("airag:knowledge:add")public Result<String> add(@RequestBody AiragKnowledge airagKnowledge) {airagKnowledge.setStatus(LLMConsts.STATUS_ENABLE);airagKnowledgeService.save(airagKnowledge);return Result.OK("添加成功!");}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/922287.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

天津网站设计网站编辑器哪个好用

模板是一个让C支持范型编程的重要功能&#xff0c;它本质上是一个万能变量适配器&#xff1b;vector,pair等都是使用模板实现的 模板是C的一个强大特性&#xff0c;它允许您编写通用的代码来处理不同的数据类型。您可以有函数模板和类模板。 函数模板: 函数模板允许您创建一…

wordpress二次元主体seo推广方式

在有些时候我们的网友不清楚电脑显示器如何设置成满屏&#xff0c;那么下面就由学习啦小编来给你们说说电脑显示器设置成满屏的方法吧&#xff0c;希望可以帮到你们哦!电脑显示器设置成满屏的方法&#xff1a;右击桌面&#xff0c;选择弹出对话框中的【屏幕分辨率】如下图。弹出…

公司建网站多少钱没有网站怎么做百度竞价

在网页中&#xff0c;辛辛苦苦写的文章&#xff0c;被别人复制粘贴给盗用去另很多站长感到非常无奈&#xff0c;通常大家复制都会使用选取右键复制&#xff0c;或CTRLC等方式&#xff0c;下面介绍几种禁止鼠标右键代码&#xff0c;可减少网页上文章被抄袭的几率&#xff0c;当然…

建设官方网站的费用账务处理机构网站源码

1.下面是这款AP的全裸图&#xff0c;AP的无线网卡采用了AR9223&#xff0c;PHY采用了博通的BCM5461&#xff0c;主控CPU位octeon 500&#xff0c;射频功放采用的是RF5602方案。由于这款CPU并不常见&#xff0c;我至今未在网上找到它的datasheet&#xff0c;导致我们在玩这款AP的…

CF868F题解

先考虑朴素的暴力,设 \(f_{k,i}\) 表示前 \(i\) 个数划分为 \(k\) 段的最小代价,有 \(f_{k,i}=\min_j\{f_{k-1,j-1}+w(j,i)\}\) ,其中, \(w(x,y)\) 表示 \([x,y]\) 中相同元素的对数。 可以先在外层枚举 \(k\) ,考…

ThinkPHP反序列化分析

ThinkPHPv5.0.x反序列化利用链 前言 漏洞测试环境: php 7.3 + Windows + ThinkPHPv5.0.23 漏洞测试代码: index/controller/Index.php <?php namespace app\index\controller;class Index {public function index(…

建设京东物流网站的目标是什么广州网站排名专业乐云seo

VScode 国内下载源 进入官网 https://code.visualstudio.com/ 点击下载 复制下载链接到新的浏览器标签 将地址中的/stable前的az764295.vo.msecnd.net换成vscode.cdn.azure.cn&#xff0c;再回车就会直接在下载列表啦。 参考大神博客 2.使用nvm 对 node 和npm进行版本控制…

AT_iroha2019_day4_l 题解

题意:有一个数轴, \(Q\) 次操作,三种操作类型:1.在位置为 \(x\) 处插入权值为 \(w\) 的数,不会在有数的位置重复插入。 2.删除位置 \(x\) 处的数,保证删前 \(x\) 处有数。 3.给定位置 \(x\) ,对于一个数轴上有数…

怎么在工商网站做实名认证推广效果好的有哪些

想要在前端项目中压缩图片&#xff0c;然后再上传到后端保存&#xff0c;就需要一个压缩工具的帮助&#xff0c;暂时有两个依赖库可以选择&#xff1a;image-conversion和yireen/squoosh-browser&#xff0c;看了官方仓库地址和更新时间等详情&#xff0c;发现还是yireen/squoo…

兰州建设局网站公告wordpress Cute

1.你先作个自我介绍吧 面试官您好&#xff0c;我叫张睿超&#xff0c;来自湖南长沙&#xff0c;大学毕业于湖南农业大学&#xff0c;是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。 大学里面主修的课程是Java、Python、数字图…

做前端网站要注意哪些网站建设模板怎么设计

注解的存在主要是为了简化XML的配置。Spring6倡导全注解开发。 注解开发的优点:提高开发效率 注解开发的缺点:在一定程度上违背了OCP原则&#xff0c;使用注解的开发的前提是需求比较固定&#xff0c;变动较小。 1 注解的注解称为元注解 自定义一个注解: package com.sunspl…

企业报刊网站建设情况总结阿里网站seo

第一部分&#xff1a;跨界电商的兴起与网络安全挑战 1.1 跨界电商的崭露头角 跨界电商已经成为全球贸易的新引擎&#xff0c;企业纷纷踏上了拓展国际市场的征程。 1.2 网络安全的不容忽视 跨界电商的增长也伴随着网络安全威胁的增加。黑客攻击、数据泄露和欺诈行为等风险呈…

不符合网站外链建设原则的是个人备案网站能用公司

文章目录 前言音频服务audioserver音频数据链路hal 提供什么样的作用 前言 Android 的音频是一个相当复杂的部分。从应用到框架、hal、kernel、最后到硬件&#xff0c;每个部分的知识点都相当的多。而android 这部分代码在版本之间改动很大、其中充斥着各种workaround的处理&a…

摄影学习网站连云港市建设局网站安全员考试

文章目录 前言一、安装与运行命令行运行 python 文件 二、变量和简单数据类型2.1 变量命名规则2.2 字符串2.2.1 字符串的简单运算title()upper()、lower() 2.2.2 合并&#xff08;拼接&#xff09;字符串2.2.3 使用制表符或换行符来添加空白2.2.4 删除空白2.2.5 Python 2 中的 …

北京seo网站内部优化电子商务网站建设的定义

随着科技的不断进步和创新&#xff0c;无人机技术在各个领域中都发挥着越来越重要的作用。其中&#xff0c;光伏电站对于无人机的应用也成为了行业内的高效运维方式之一&#xff0c;凭借无人机卓越的性能和可靠性&#xff0c;有效的减少了人力运维的危险性和延迟性&#xff0c;…

2025.9.29

今天又是非常疲惫的周一,一天都是满课,上午两节,下午三个半小时,上完课之后我去好想来买零食,回来时候拿外卖,吃完饭后去洗澡,然后录下午课的视频。

网站开发使用的工具类做网站的技术理论

const用法主要是防止定义的对象再次被修改,定义对象变量时要初始化变量 下面我就介绍一下几种常见的用法 1.用于定义常量变量,这样这个变量在后面就不可以再被修改 const int Val 10; //Val 20; //错误,不可被修改 2. 保护传参时参数不被修改,如果使用引用传递参数或按地址传…

网站开发的语言做网站个人

From: http://www.cnblogs.com/caosiyang/archive/2012/08/21/2648870.html printf()和fprintf()这些输出函数的参数是可变的&#xff0c;在调试程序时&#xff0c;你可能希望定义自己的参数可变的输出函数&#xff0c; 那么可变参数宏会是一个选择。 C99中规定宏可以像函数…

深入解析:前端笔记:HTML output标签介绍及用法

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

成都网络推广建站深圳华强北商业圈

使用基于全球知名的 Corel Painter 画笔技术构建的 100 款逼真像素画笔&#xff0c;以全新的方式将您独特的想法变为现实&#xff01;试用 CorelDRAW 的全新美术画笔&#xff0c;探索您的创意想法。 使用 CorelDRAW 中现在可用的远程字体&#xff0c;畅享更多创作自由&#xf…