@@ -348,3 +348,166 @@ def test_rate_limiting_bypassed_ip_with_user():
348348 assert should_ratelimit_request (metadata , "1.2.3.4" , {"id" : "123" }, cm ) == {
349349 "block" : False
350350 }
351+
352+
353+ def test_rate_limits_by_user_with_different_ips ():
354+ user = {"id" : "123" }
355+ cm = create_connection_manager (
356+ [
357+ {
358+ "method" : "POST" ,
359+ "route" : "/login" ,
360+ "forceProtectionOff" : False ,
361+ "rateLimiting" : {
362+ "enabled" : True ,
363+ "maxRequests" : 3 ,
364+ "windowSizeInMS" : 1000 ,
365+ },
366+ },
367+ ]
368+ )
369+ route_metadata = create_route_metadata ()
370+ # First request from user 123, IP 1.2.3.4
371+ assert should_ratelimit_request (route_metadata , "1.2.3.4" , user , cm , "group1" ) == {
372+ "block" : False
373+ }
374+ # First request from user 123, IP 4.3.2.1
375+ assert should_ratelimit_request (route_metadata , "4.3.2.1" , user , cm , "group1" ) == {
376+ "block" : False
377+ }
378+ # Second request from user 123, IP 1.2.3.4
379+ assert should_ratelimit_request (route_metadata , "1.2.3.4" , user , cm , "group1" ) == {
380+ "block" : False
381+ }
382+ # This request should trigger the rate limit by group
383+ assert should_ratelimit_request (route_metadata , "4.3.2.1" , user , cm , "group1" ) == {
384+ "block" : True ,
385+ "trigger" : "group" ,
386+ }
387+
388+
389+ def test_rate_limits_different_users_in_same_group ():
390+ cm = create_connection_manager (
391+ [
392+ {
393+ "method" : "POST" ,
394+ "route" : "/login" ,
395+ "forceProtectionOff" : False ,
396+ "rateLimiting" : {
397+ "enabled" : True ,
398+ "maxRequests" : 3 ,
399+ "windowSizeInMS" : 1000 ,
400+ },
401+ },
402+ ]
403+ )
404+ route_metadata = create_route_metadata ()
405+ # First request from user 123, IP 1.2.3.4
406+ assert should_ratelimit_request (
407+ route_metadata , "1.2.3.4" , {"id" : "123" }, cm , "group1"
408+ ) == {"block" : False }
409+ # First request from user 456, IP 4.3.2.1
410+ assert should_ratelimit_request (
411+ route_metadata , "4.3.2.1" , {"id" : "456" }, cm , "group1"
412+ ) == {"block" : False }
413+ # Second request from user 789, IP 1.2.3.4
414+ assert should_ratelimit_request (
415+ route_metadata , "1.2.3.4" , {"id" : "789" }, cm , "group1"
416+ ) == {"block" : False }
417+ # This request should trigger the rate limit by group
418+ assert should_ratelimit_request (
419+ route_metadata , "4.3.2.1" , {"id" : "101112" }, cm , "group1"
420+ ) == {
421+ "block" : True ,
422+ "trigger" : "group" ,
423+ }
424+
425+
426+ def test_works_with_multiple_rate_limit_groups_and_different_users ():
427+ cm = create_connection_manager (
428+ [
429+ {
430+ "method" : "POST" ,
431+ "route" : "/login" ,
432+ "forceProtectionOff" : False ,
433+ "rateLimiting" : {
434+ "enabled" : True ,
435+ "maxRequests" : 2 ,
436+ "windowSizeInMS" : 1000 ,
437+ },
438+ },
439+ ]
440+ )
441+ route_metadata = create_route_metadata ()
442+ # First request from user 123, group1
443+ assert should_ratelimit_request (
444+ route_metadata , "1.2.3.4" , {"id" : "123" }, cm , "group1"
445+ ) == {"block" : False }
446+ # Second request from user 789, group1
447+ assert should_ratelimit_request (
448+ route_metadata , "1.2.3.4" , {"id" : "789" }, cm , "group1"
449+ ) == {"block" : False }
450+ # First request from user 101112, group2
451+ assert should_ratelimit_request (
452+ route_metadata , "4.3.2.1" , {"id" : "101112" }, cm , "group2"
453+ ) == {"block" : False }
454+ # This request should trigger the rate limit for group1
455+ assert should_ratelimit_request (
456+ route_metadata , "1.2.3.4" , {"id" : "789" }, cm , "group1"
457+ ) == {
458+ "block" : True ,
459+ "trigger" : "group" ,
460+ }
461+ # This request should also trigger the rate limit for group1
462+ assert should_ratelimit_request (
463+ route_metadata , "1.2.3.4" , {"id" : "4321" }, cm , "group1"
464+ ) == {
465+ "block" : True ,
466+ "trigger" : "group" ,
467+ }
468+ # First request from user 953, group2
469+ assert should_ratelimit_request (
470+ route_metadata , "4.3.2.1" , {"id" : "953" }, cm , "group2"
471+ ) == {"block" : False }
472+ # This request should trigger the rate limit for group2
473+ assert should_ratelimit_request (
474+ route_metadata , "4.3.2.1" , {"id" : "1563" }, cm , "group2"
475+ ) == {
476+ "block" : True ,
477+ "trigger" : "group" ,
478+ }
479+
480+
481+ def test_rate_limits_by_group_if_user_is_not_set ():
482+ cm = create_connection_manager (
483+ [
484+ {
485+ "method" : "POST" ,
486+ "route" : "/login" ,
487+ "forceProtectionOff" : False ,
488+ "rateLimiting" : {
489+ "enabled" : True ,
490+ "maxRequests" : 3 ,
491+ "windowSizeInMS" : 1000 ,
492+ },
493+ },
494+ ]
495+ )
496+ route_metadata = create_route_metadata ()
497+ # First request, no user, IP 1.2.3.4
498+ assert should_ratelimit_request (route_metadata , "1.2.3.4" , None , cm , "group1" ) == {
499+ "block" : False
500+ }
501+ # Second request, no user, IP 4.3.2.1
502+ assert should_ratelimit_request (route_metadata , "4.3.2.1" , None , cm , "group1" ) == {
503+ "block" : False
504+ }
505+ # Third request, no user, IP 1.2.3.4
506+ assert should_ratelimit_request (route_metadata , "1.2.3.4" , None , cm , "group1" ) == {
507+ "block" : False
508+ }
509+ # This request should trigger the rate limit by group
510+ assert should_ratelimit_request (route_metadata , "4.3.2.1" , None , cm , "group1" ) == {
511+ "block" : True ,
512+ "trigger" : "group" ,
513+ }
0 commit comments