@@ -453,9 +453,12 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
453453 var statusMatches []version2.StatusMatch
454454 var healthChecks []version2.HealthCheck
455455 var limitReqZones []version2.LimitReqZone
456+ var authJWTClaimSets []version2.AuthJWTClaimSet
456457
457458 limitReqZones = append (limitReqZones , policiesCfg .RateLimit .Zones ... )
458459
460+ authJWTClaimSets = append (authJWTClaimSets , policiesCfg .RateLimit .AuthJWTClaimSets ... )
461+
459462 // generate upstreams for VirtualServer
460463 for _ , u := range vsEx .VirtualServer .Spec .Upstreams {
461464
@@ -606,6 +609,8 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
606609 }
607610 limitReqZones = append (limitReqZones , routePoliciesCfg .RateLimit .Zones ... )
608611
612+ authJWTClaimSets = append (authJWTClaimSets , routePoliciesCfg .RateLimit .AuthJWTClaimSets ... )
613+
609614 dosRouteCfg := generateDosCfg (dosResources [r .Path ])
610615
611616 if len (r .Matches ) > 0 {
@@ -690,7 +695,7 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
690695 }
691696
692697 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
694699 if r .LocationSnippets == "" {
695700 locSnippets = vsrLocationSnippetsFromVs [vsrNamespaceName ]
696701 }
@@ -747,6 +752,8 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
747752
748753 limitReqZones = append (limitReqZones , routePoliciesCfg .RateLimit .Zones ... )
749754
755+ authJWTClaimSets = append (authJWTClaimSets , routePoliciesCfg .RateLimit .AuthJWTClaimSets ... )
756+
750757 dosRouteCfg := generateDosCfg (dosResources [r .Path ])
751758
752759 if len (r .Matches ) > 0 {
@@ -828,12 +835,13 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
828835 })
829836
830837 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 ,
837845 Server : version2.Server {
838846 ServerName : vsEx .VirtualServer .Spec .Host ,
839847 Gunzip : vsEx .VirtualServer .Spec .Gunzip ,
@@ -893,9 +901,10 @@ func (vsc *virtualServerConfigurator) GenerateVirtualServerConfig(
893901
894902// rateLimit hold the configuration for the ratelimiting Policy
895903type 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
899908}
900909
901910// jwtAuth hold the configuration for the JWTAuth & JWKSAuth Policies
@@ -1011,6 +1020,9 @@ func (p *policiesCfg) addRateLimitConfig(
10111020 rlZoneName := fmt .Sprintf ("pol_rl_%v_%v_%v_%v" , polNamespace , polName , vsNamespace , vsName )
10121021 p .RateLimit .Reqs = append (p .RateLimit .Reqs , generateLimitReq (rlZoneName , rateLimit ))
10131022 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+ }
10141026 if len (p .RateLimit .Reqs ) == 1 {
10151027 p .RateLimit .Options = generateLimitReqOptions (rateLimit )
10161028 } else {
@@ -1667,6 +1679,35 @@ func removeDuplicateLimitReqZones(rlz []version2.LimitReqZone) []version2.LimitR
16671679 return result
16681680}
16691681
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+
16701711func addPoliciesCfgToLocation (cfg policiesCfg , location * version2.Location ) {
16711712 location .Allow = cfg .Allow
16721713 location .Deny = cfg .Deny
0 commit comments