第三方软件评测测试实验室【Gatling模拟认证用户登录、令牌使用、自动刷新到并发会话控制】

Gatling模拟需要认证的用户行为涉及从登录、令牌使用、自动刷新到并发会话控制。

认证会话

模拟登录和令牌管理

建立认证会话的第一步。

执行登录提取令牌

import io.gatling.core.Predef._ import io.gatling.http.Predef._ class AuthenticationSimulation extends Simulation { val httpProtocol = http.baseUrl("https://api.zmtests.com") // 1. 定义用户证据Feeder val credentialsFeeder = csv("data/credentials.csv").circular val loginScenario = scenario("用户登录和令牌管理") .feed(credentialsFeeder) // 2. 执行登录请求 .exec( http("用户登录") .post("/auth/login") .body(StringBody("""{"username":"${username}", "password":"${password}"}""")).asJson .check( // 3. 重点:从响应中提取令牌并存入Session jsonPath("$.access_token").saveAs("accessToken"), jsonPath("$.refresh_token").optional.saveAs("refreshToken"), jsonPath("$.expires_in").optional.saveAs("tokenExpiresIn") ) ) .exec(session => { // 4. 记录登录成功时间,用于计算令牌过期 println(s"用户 ${session("username").as[String]} 登录成功,令牌: ${session("accessToken").as[String].take(10)}...") session.set("loginTime", System.currentTimeMillis() / 1000) }) .pause(1) }

重点:使用 .check() 提取响应中的令牌,并用saveAs将其存入每个虚拟用户独立的Session中,后续请求通过 ${accessToken}来引用。

文章来源:卓码软件测评

精彩推荐:点击蓝字即可
软件负载测试API自动化测试软件测试第三方软件测试软件性能测试软件测试机构

使用令牌调用认证API

.exec( http("获取用户资料") .get("/api/user/profile") .header("Authorization", "Bearer ${accessToken}") // 从Session动态注入令牌 .check(status.is(200)) )

令牌自动刷新

需要在令牌失效前主动刷新。

主动刷新在业务请求前检查并刷新

在业务操作前,通过计算判断令牌是不是需要刷新。

// 假设令牌有效期为3600秒,我们设置阈值在剩余300秒时刷新 .exec(session => { val loginTime = session("loginTime").as[Long] val currentTime = System.currentTimeMillis() / 1000 val tokenAge = currentTime - loginTime val shouldRefresh = session.contains("refreshToken") && tokenAge > (3600 - 300) session.set("shouldRefreshToken", shouldRefresh) }) .doIf("${shouldRefreshToken}") { // 条件执行刷新 exec( http("刷新访问令牌") .post("/auth/refresh") .body(StringBody("""{"refresh_token":"${refreshToken}"}""")).asJson .check( jsonPath("$.access_token").saveAs("accessToken"), jsonPath("$.refresh_token").optional.saveAs("refreshToken") // 更新refresh_token ) ) .exec(session => { // 重置登录时间 println(s"用户 ${session("username").as[String]} 令牌已刷新") session.set("loginTime", System.currentTimeMillis() / 1000) .remove("shouldRefreshToken") }) }

被动刷新处理401未授权响应

当令牌已过期,请求返回401时,进行刷新并重试。

import io.gatling.commons.validation.Validation import io.gatling.core.action.builder.FeedBuilder // 定义刷新令牌的链,可重用 val refreshTokenChain = exec( http("被动刷新令牌") .post("/auth/refresh") .body(StringBody("""{"refresh_token":"${refreshToken}"}""")).asJson .check( jsonPath("$.access_token").saveAs("accessToken"), jsonPath("$.refresh_token").optional.saveAs("refreshToken") ) ) // 在可能失败的请求中尝试恢复 .exec( http("安全调用敏感API") .get("/api/sensitive/data") .header("Authorization", "Bearer ${accessToken}") .check(status.in(200, 401)) // 允许401 .check( // 如果是401,触发特定处理 status.is(401).saveAs("isUnauthorized") ) ) .doIf("${isUnauthorized}") { exec(refreshTokenChain) .exec( // 重试原请求 http("安全调用敏感API - 重试") .get("/api/sensitive/data") .header("Authorization", "Bearer ${accessToken}") .check(status.is(200)) ) .exec(session => session.remove("isUnauthorized")) }

模拟并发用户和会话

不同用户有不同的认证状态和行为。

模拟混合用户类型

// 定义不同用户情形 val registeredUserScenario = scenario("已注册用户") .exec(loginScenario) // 复用登录流程 .exec(/* 已认证用户的操作 */) val guestUserScenario = scenario("访客用户") .exec(/* 无需登录的公共操作 */) // 在同一个测试中注入不同比例的用户 setUp( registeredUserScenario.inject( rampUsers(100).during(30) ), guestUserScenario.inject( rampUsers(50).during(30) ) ).protocols(httpProtocol)

模拟用户登出和会话清理

.exec( http("用户登出") .post("/auth/logout") .header("Authorization", "Bearer ${accessToken}") .check(status.is(204)) ) .exec(session => { println(s"用户 ${session("username").as[String]} 已登出") session.removeAll("accessToken", "refreshToken", "loginTime") // 清理会话中的敏感数据 })

建议

令牌刷新方法

避免:不要所有用户在同一时间刷新。引入随机延迟:.pause(Random.nextInt(10).seconds)。

区分短令牌和长令牌:在Session中分开存储,使用不同刷新思路。

Session管理

最小化Session数据:只存储必要数据,避免内存过度使用。

使用.transform预处理数据:在Feeder读取数据时即完成清洗和格式化。

及时清理:在登出或会话结束时,使用.remove或.removeAll清理敏感数据。

并发控制和资源管理

限制最大并发刷新数:使用throttle限制令牌刷新端点压力。

setUp( loginScenario.inject(rampUsers(1000).during(60)) ).throttle( reachRps(50).in(10), // 限制刷新接口最大50 RPS holdFor(2 minutes) )

监控虚拟用户状态:通过Gatling日志或自定义钩子记录异常。

调试

记录重点信息:在.exec中打印令牌片段和状态。

证实Session状态:使用session => { println(session); session } 调试。

检查响应完整性:保证刷新后新令牌被正确存储。

Gatling实现认证会话管理是将令牌生命周期管理、条件性执行思路、差别化用户模拟和健壮的错误处理进行有机结合。

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

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

相关文章

企业级JDK配置实战:多版本管理与安全策略

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个企业级JDK管理工具,功能包括:1.多版本JDK并行安装与切换 2.基于角色的访问控制(RBAC) 3.自动安全补丁检查与更新 4.生成安全…

《用 Python 实现布隆过滤器:为什么我们需要多个哈希函数?》

《用 Python 实现布隆过滤器:为什么我们需要多个哈希函数?》 一、引子:从“是否存在”说起 在处理大规模数据时,我们常常面临一个看似简单却至关重要的问题: “某个元素是否存在于集合中?” 比如&#xf…

基于PLC物料分拣控制系统设计

物料分拣控制系统的硬件设计 物料分拣控制系统的硬件设计包括PLC的选择和传感器的选择两部分 [13] 。 3.1 PLC的选用 3.1.1什么是PLC PLC的全称是Programmable Logic Controller(可编程序控制器),刚引入国内时,曾简称为PC。后来,I…

2026科技风口:有哪些前沿场景即将落地?

2026年,是超高清科技场景的应用元年,超高清企业品牌不再局限于销售产品,更在于为用户打造一个可以落地的【超高清场景】。随着5G商用落地与人工智能技术的持续成熟,8K技术迎来了爆发的临界点,“超高清AI”的浪潮正以前…

产后恢复店选收银系统,玄微云这5项能力必须考察!

随着大健康产业进入精细化运营阶段,产后恢复中心正经历从传统服务向全周期健康管理的深度转型。在这一过程中,产后恢复会员店务收银软件已远超出简单的交易处理范畴,成为串联客户管理、服务交付、会员运营与经营决策的核心枢纽。面对市场上众…

IDEA集成CURSOR开发效率提升秘籍

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 构建一个IDEA集成CURSOR应用,重点展示快速开发流程和效率优势。点击项目生成按钮,等待项目生成完整后预览效果 作为一名长期使用IDEA进行开发的程序员&…

自动化部署脚本开发:一键安装AI打码系统

自动化部署脚本开发:一键安装AI打码系统 1. 引言 1.1 业务场景描述 在数字化时代,图像和视频内容的传播日益频繁,但随之而来的是个人隐私泄露风险的急剧上升。尤其是在社交媒体、企业宣传、公共监控等场景中,未经处理的人脸信息…

企业级JAVA环境配置最佳实践:从零到生产环境

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个企业级JAVA环境配置管理系统,功能包括:1.支持多JDK版本并行安装和切换 2.集成Maven/Gradle环境配置 3.容器化部署支持(Docker) 4.环境健康检查 5.配…

快速验证:用旧版Android Studio复现经典漏洞

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个漏洞复现工具包生成器:输入CVE编号→自动输出:1. 受影响的Android Studio版本范围 2. 对应版本下载链接 3. 最小化测试项目模板 4. 漏洞检测脚本。…

广州哪家支付系统稳定

在预付费行业信任危机频发、支付安全备受关注的当下,一款稳定可靠的支付系统成为百万实体商家的刚需。自 2016 年创办以来,搜熊旗下微收付(广东)信息技术有限公司已深耕行业十年,2024 年广州运营部门的成立更标志着品牌…

孕产行业AI智能体开发公司哪家可靠?玄微子AI智能体成优选

随着孕产行业规模持续扩大,新生代父母对品质化、智能化服务的需求激增,AI智能体已成为孕产机构提升核心竞争力的关键。但市场上AI智能体开发公司良莠不齐,如何筛选出适配孕产行业需求、技术可靠的合作伙伴,成为众多机构的核心痛点…

HORIBA OBS-ONE GS Unit车载排放测量系统项目应用实践

HORIBA OBS-ONE GS Unit车载排放测量系统项目应用实践随着真实驾驶排放(RDE)测试纳入机动车排放监管与认证体系,具备复杂路况适配能力的车载排放测量设备成为汽车研发、检测及环保监管领域的基础配置。近期,项目团队应用HORIBA OB…

XPOSED开发效率翻倍:这些工具让你事半功倍

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个XPOSED开发效率工具包,包含:1.APK快速反编译工具 2.类和方法搜索增强 3.实时Hook调试器 4.代码模板库 5.自动化测试框架 6.性能分析工具。要求每个…

AKSHARE vs 传统爬虫:金融数据获取效率对比

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个对比演示项目,分别使用AKSHARE API和传统爬虫技术获取相同的金融数据。项目应展示两种方法在开发时间、代码复杂度、运行效率、数据完整性和维护成本等方面的差…

数字孪生开发技术栈

开发数字孪生(Digital Twin)项目是一个高度跨学科的过程,需要将物理世界的实时数据与虚拟世界的仿真模型深度融合。以下是 2026 年主流的数字孪生开发技术栈,按照数据的流向和处理层级进行划分:1. 物理层:感…

基于双层优化的综合能源系统规划设计:微网多电源容量优化配置

基于双层优化的综合能源系统规划设计 采用kkt条件,大M法,对偶理论求解 代码注释齐全,cplex求解 良心代码,适合新手学习。 主要内容:微网的多电源容量优化配置,规划出最佳的微电网光伏、风电、储能等多电源的容量配置方…

如何用LangGraph中文文档加速AI应用开发

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 基于LangGraph中文文档,开发一个智能问答系统,能够理解中文问题并从文档中提取准确答案。系统需要包含以下功能:1. 中文自然语言理解模块 2. 文…

3分钟搞定Android Studio汉化:效率提升全攻略

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个极简Android Studio汉化工具,特点:1) 3步完成安装(下载->运行->重启);2) 自动识别系统语言;3) 智能跳过已汉化项目&a…

SPEECHSYNTHESISUTTERANCE实战应用案例分享

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 创建一个SPEECHSYNTHESISUTTERANCE实战项目,包含完整的功能实现和部署方案。点击项目生成按钮,等待项目生成完整后预览效果 今天想和大家分享一个非常实用的…

2025年专业摄像机行业综合概况分析

2025年专业摄像机行业综合概况分析,以下数据来源于多个市场分析与咨询平台。根据专业摄像机市场分析 (2032)显示,全球专业摄像机市场预计将出现显著增长,预计2024年估值将达到34.7亿美元。专业摄像机市场的复合年增长率(增长率)预计将达到5.1…