@@ -453,9 +453,12 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
453
453
var statusMatches []version2.StatusMatch
454
454
var healthChecks []version2.HealthCheck
455
455
var limitReqZones []version2.LimitReqZone
456
+ var authJWTClaimSets []version2.AuthJWTClaimSet
456
457
457
458
limitReqZones = append (limitReqZones , policiesCfg .RateLimit .Zones ... )
458
459
460
+ authJWTClaimSets = append (authJWTClaimSets , policiesCfg .RateLimit .AuthJWTClaimSets ... )
461
+
459
462
// generate upstreams for VirtualServer
460
463
for _ , u := range vsEx .VirtualServer .Spec .Upstreams {
461
464
@@ -606,6 +609,8 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
606
609
}
607
610
limitReqZones = append (limitReqZones , routePoliciesCfg .RateLimit .Zones ... )
608
611
612
+ authJWTClaimSets = append (authJWTClaimSets , routePoliciesCfg .RateLimit .AuthJWTClaimSets ... )
613
+
609
614
dosRouteCfg := generateDosCfg (dosResources [r .Path ])
610
615
611
616
if len (r .Matches ) > 0 {
@@ -690,7 +695,7 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
690
695
}
691
696
692
697
locSnippets := r .LocationSnippets
693
- // use the VirtualServer location snippet if the route does not define any
698
+ // use the VirtualServer location snippet if the route does not define any
694
699
if r .LocationSnippets == "" {
695
700
locSnippets = vsrLocationSnippetsFromVs [vsrNamespaceName ]
696
701
}
@@ -747,6 +752,8 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
747
752
748
753
limitReqZones = append (limitReqZones , routePoliciesCfg .RateLimit .Zones ... )
749
754
755
+ authJWTClaimSets = append (authJWTClaimSets , routePoliciesCfg .RateLimit .AuthJWTClaimSets ... )
756
+
750
757
dosRouteCfg := generateDosCfg (dosResources [r .Path ])
751
758
752
759
if len (r .Matches ) > 0 {
@@ -828,12 +835,13 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
828
835
})
829
836
830
837
vsCfg := version2.VirtualServerConfig {
831
- Upstreams : upstreams ,
832
- SplitClients : splitClients ,
833
- Maps : maps ,
834
- StatusMatches : statusMatches ,
835
- LimitReqZones : removeDuplicateLimitReqZones (limitReqZones ),
836
- HTTPSnippets : httpSnippets ,
838
+ Upstreams : upstreams ,
839
+ SplitClients : splitClients ,
840
+ Maps : maps ,
841
+ StatusMatches : statusMatches ,
842
+ LimitReqZones : removeDuplicateLimitReqZones (limitReqZones ),
843
+ AuthJWTClaimSets : removeDuplicateAuthJWTClaimSets (authJWTClaimSets ),
844
+ HTTPSnippets : httpSnippets ,
837
845
Server : version2.Server {
838
846
ServerName : vsEx .VirtualServer .Spec .Host ,
839
847
Gunzip : vsEx .VirtualServer .Spec .Gunzip ,
@@ -893,9 +901,10 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
893
901
894
902
// rateLimit hold the configuration for the ratelimiting Policy
895
903
type rateLimit struct {
896
- Reqs []version2.LimitReq
897
- Zones []version2.LimitReqZone
898
- Options version2.LimitReqOptions
904
+ Reqs []version2.LimitReq
905
+ Zones []version2.LimitReqZone
906
+ Options version2.LimitReqOptions
907
+ AuthJWTClaimSets []version2.AuthJWTClaimSet
899
908
}
900
909
901
910
// jwtAuth hold the configuration for the JWTAuth & JWKSAuth Policies
@@ -1011,6 +1020,9 @@ func (p *policiesCfg) addRateLimitConfig(
1011
1020
rlZoneName := fmt .Sprintf ("pol_rl_%v_%v_%v_%v" , polNamespace , polName , vsNamespace , vsName )
1012
1021
p .RateLimit .Reqs = append (p .RateLimit .Reqs , generateLimitReq (rlZoneName , rateLimit ))
1013
1022
p .RateLimit .Zones = append (p .RateLimit .Zones , generateLimitReqZone (rlZoneName , rateLimit , podReplicas ))
1023
+ if rateLimit .Condition != nil && rateLimit .Condition .JWT .Claim != "" && rateLimit .Condition .JWT .Match != "" {
1024
+ p .RateLimit .AuthJWTClaimSets = append (p .RateLimit .AuthJWTClaimSets , generateAuthJwtClaimSet (* rateLimit .Condition .JWT , vsNamespace , vsName ))
1025
+ }
1014
1026
if len (p .RateLimit .Reqs ) == 1 {
1015
1027
p .RateLimit .Options = generateLimitReqOptions (rateLimit )
1016
1028
} else {
@@ -1667,6 +1679,35 @@ func removeDuplicateLimitReqZones(rlz []version2.LimitReqZone) []version2.LimitR
1667
1679
return result
1668
1680
}
1669
1681
1682
+ func removeDuplicateAuthJWTClaimSets (ajcs []version2.AuthJWTClaimSet ) []version2.AuthJWTClaimSet {
1683
+ encountered := make (map [string ]bool )
1684
+ var result []version2.AuthJWTClaimSet
1685
+
1686
+ for _ , v := range ajcs {
1687
+ if ! encountered [v .Variable ] {
1688
+ encountered [v .Variable ] = true
1689
+ result = append (result , v )
1690
+ }
1691
+ }
1692
+
1693
+ return result
1694
+ }
1695
+
1696
+ func generateAuthJwtClaimSet (jwtCondition conf_v1.JWTCondition , vsNamespace string , vsName string ) version2.AuthJWTClaimSet {
1697
+ return version2.AuthJWTClaimSet {
1698
+ Variable : generateAuthJwtClaimSetVariable (jwtCondition .Claim , vsNamespace , vsName ),
1699
+ Claim : generateAuthJwtClaimSetClaim (jwtCondition .Claim ),
1700
+ }
1701
+ }
1702
+
1703
+ func generateAuthJwtClaimSetVariable (claim string , vsNamespace string , vsName string ) string {
1704
+ return fmt .Sprintf ("$jwt_%v_%v_%v" , vsNamespace , vsName , strings .Join (strings .Split (claim , "." ), "_" ))
1705
+ }
1706
+
1707
+ func generateAuthJwtClaimSetClaim (claim string ) string {
1708
+ return strings .Join (strings .Split (claim , "." ), " " )
1709
+ }
1710
+
1670
1711
func addPoliciesCfgToLocation (cfg policiesCfg , location * version2.Location ) {
1671
1712
location .Allow = cfg .Allow
1672
1713
location .Deny = cfg .Deny
0 commit comments