当前位置: 首页 > 知识库问答 >
问题:

如何在Gatling中为每个虚拟用户(java)提供唯一的身份验证?

游炳
2023-03-14

我正在尝试进行一个模拟,其中Gatling中的每个虚拟用户都有一个唯一的登录/身份验证,并执行我记录和编码的一系列操作。但我正在努力正确设置授权。这是我的代码

public class SampleSimulation extends Simulation {
  static Random rand = new Random();
  HttpProtocolBuilder httpProtocol = http
      .baseUrl("http://base-url.com") // Here is the root for all relative URLs
      .acceptHeader("text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8") // Here are the common headers
      .acceptEncodingHeader("gzip, deflate")
      .acceptLanguageHeader("en-US,en;q=0.5")
      .userAgentHeader("Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:16.0) Gecko/20100101 Firefox/16.0");
      // .basicAuth("username", "password");
static ActionBuilder addAuthentication(String name){
    String username = "username"; // generate random username from valid ones
    String pw = "password";  // generate random password that's valid for username
    http.basicAuth(username, pw);
    return http(name).get("/rest/activity/me");
  }
static ActionBuilder getMe(String name){
    return http(name)
        .get("/rest/activity/me");
  }

...

 ScenarioBuilder scn = scenario("name")
                        .feed(Utils.getItemIdFeeder())
                        .exec(addAuthentication("n"))
                        .exec(getMe("n")).pause(Duration.ofMillis(300),Duration.ofMillis(750))
                        .exec(postUpdateLocale("n")).pause(Duration.ofMillis(0),Duration.ofMillis(4))
                        .exec(getBalance("n")).pause(Duration.ofMillis(500), Duration.ofMillis(2000))
                        .exec(getMe("n")).pause(Duration.ofMillis(0), Duration.ofMillis(15))
                        .exec(getInventory("n")).pause(Duration.ofMillis(100), Duration.ofMillis(250))
                       );

 {
    setUp(scn.injectOpen(nothingFor(4), // 1
              atOnceUsers(10), // 2
              rampUsers(10).during(5)) //, // 3
          .protocols(httpProtocol));
 }
}

因此,当我在静态声明中提供用户名和密码时(我已经注释掉了.basicAuth行),它就可以工作了。然而,就服务器而言,gatling创建的每个虚拟用户都是相同的用户。如果我运行我在这里添加的代码,我的所有请求都会得到http 401s,这是未经授权的。

谁能告诉我我做错了什么,在Gatling中处理凭据的正确方法是什么?请注意,我已经在为项目使用提要器。

谢谢你!

共有1个答案

靳高明
2023-03-14
http.basicAuth(username, pw);
return http(name).get("/rest/activity/me");

因为HttpProtocolBuilder是不可变的,所以这绝对没有任何作用。

我建议你花点时间阅读文件和加特林学院,你最终会节省很多时间。

如果查看basicAuth的文档,您会发现它也可以接受Gatling EL表达式,因此您可以执行以下操作:

  1. <代码>。基本密码(“\{用户名}”,“\{密码}”)
  2. 为每个虚拟用户注入所需的键值对,例如使用feeder或带有函数的exec块
 类似资料:
  • 我在调试身份验证问题时遇到了这个代码片段: 我在调试和摆弄用户凭证时注意到,如果第一个身份验证提供者(即< code > userdailsservice )无法对我的用户进行身份验证,那么就会远程调用我的LDAP服务器来尝试对我的用户进行身份验证。但是,如果第一个身份验证提供者成功地对我的用户进行了身份验证,则不会调用第二个身份验证提供者。 我的问题是,列出这些身份验证提供者的工作方式是否使得如

  • 在上面的代码示例中,试图为每个请求生成唯一的txn-id。但是,观察到它正在重复使用相同的数字导致重复。我还尝试使用以下方法根据当前时间生成,当在1秒内触发超过1个请求时,它仍然会导致重复。 任何替代解决方案来为每个请求生成唯一ID,而不管并发情况如何? 提前感谢。

  • 我需要加载测试一个需要OAuth2的API。0通过Gatling获得的代币(我完全是新手!)但希望每个虚拟用户使用相同的令牌。我正在检索令牌ok(我想)并将其放入一个名为“access”的变量中,但在测试本身开始时,我一直得到“没有定义名为“access”的属性”。 我的令牌检索如下所示(以及下面使用的httpConf): 然后,我尝试将负载测试设置为(注意:我最初确实放了“Map”,而不是可变变

  • 我是Spring安全的新手,我想用数据库验证用户。我已经用jdbc创建了一个登录页面和一个身份验证提供程序,它检查用户是否存在于数据库中。但是我的代码没有这样做的问题是,它允许所有用户登录!我的代码怎么了?谢谢你的帮助。 这是我的安全会议。xml:

  • 我在应用程序中配置了两个身份验证提供程序,一个使用LDAP,另一个查看数据库: Spring首先尝试使用LDAP,如果它在那里找不到用户,它会尝试我的自定义提供程序。 我想做的是强制Spring在所有可用的提供者中对用户进行身份验证。在这种情况下,它只会尝试我的自定义提供程序,前提是它可以先在LDAP服务器中执行登录。如果自定义提供程序中的身份验证失败,则整个身份验证将失败。 有可能通过Sprin

  • 问题内容: 我的Web应用程序有多个身份验证管理器(一个用于API,一个用于WEB访问)。该api应该仅具有基本的身份验证服务- 通过spring安全标记进行配置,如下所示: 我无法内联身份验证提供程序,因为我希望它可以被子bean配置覆盖。 我的问题是我无法在security:authentication-provider元素上定义别名/ id以在身份验证管理器中引用它。有一个简单的解决方法吗?