You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Locust测试NextCloud页面遇401未授权错误求助

问题:Locust测试NextCloud时登录后访问受限页面返回401未授权

使用Locust对NextCloud网页进行负载测试,已成功登录并加载首页/,但访问/apps/dashboard/、/apps/deck/或/logout等页面时收到错误信息:401 Client Error: unauthorized for url: /apps/dashboard,疑似登录状态未保持,还未访问目标页面就已登出。

现有代码

import time
from locust import HttpUser, task, between

class StartUserBehavior(HttpUser):

    def on_start(self):
        self.login()

    def login(self):

        response = self.client.post('/login', json={'username':'admin', 'password':'adminpasswd'})
        if response.status_code == 200:
            print('[+]Connection succeeded')
        else:
            print('[-]Connection failed')
            print('[-]Error :', response.status_code)
    
    def on_stop(self):
        response = self.client.get('/logout')
        if response.status_code == 200:
            print('[+]Disconnection succeeded')
        else:
            print('[-]Disconnection failed')
            print('[-]Error :', response.status_code)

    @task
    def view_pages(self):
        self.client.get('/')
        time.sleep(5)
        result = self.client.get('/apps/dashboard')
        time.sleep(5)

已做检查

  • 网页地址正确
  • 使用管理员账号登录
  • 登录请求返回状态码200,确认登录操作成功
  • 仅/login和可自由访问的/页面正常,其他页面均返回401错误

解决方案

问题根源

NextCloud的登录验证依赖会话Cookie,但当前登录请求用json格式提交数据,和NextCloud实际的表单提交格式(application/x-www-form-urlencoded)不符,且参数名错误(应为user而非username),导致服务器未正确设置会话Cookie,后续请求无有效认证信息,返回401。

修改步骤

  1. 调整登录请求的提交格式和参数名:将json参数改为data,并把username替换为user(NextCloud登录表单的字段名)。
  2. 修正登录成功的判断逻辑:NextCloud登录成功后通常会返回302跳转,所以需同时判断200和302状态码。
  3. 替换time.sleep()为Locust内置的wait_time:符合Locust的最佳实践,更准确模拟用户行为。

修改后的完整代码

import time
from locust import HttpUser, task, between

class StartUserBehavior(HttpUser):
    wait_time = between(1, 3)  # 模拟用户操作间隔,替代time.sleep

    def on_start(self):
        self.login()

    def login(self):
        # 用表单格式提交登录数据,参数名对应NextCloud表单字段
        response = self.client.post('/login', data={'user':'admin', 'password':'adminpasswd'})
        if response.status_code in (200, 302):
            print('[+]登录成功')
        else:
            print('[-]登录失败')
            print('[-]错误码:', response.status_code)
    
    def on_stop(self):
        response = self.client.get('/logout')
        if response.status_code in (200, 302):
            print('[+]登出成功')
        else:
            print('[-]登出失败')
            print('[-]错误码:', response.status_code)

    @task
    def view_pages(self):
        self.client.get('/')
        self.client.get('/apps/dashboard')

额外提示

  • 可通过浏览器开发者工具(F12)查看登录请求的Form Data,确认字段名和提交格式,这是排查这类认证问题的通用方法。
  • Locust的HttpUser.client会自动管理Cookie,只要登录请求正确获取会话Cookie,后续请求会自动携带,无需手动处理。

内容的提问来源于stack exchange,提问作者Fangshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 16:07:04