Skip to content

Commit ba0b287

Browse files
authored
add auth_jwt_claim_set in nginx plus virtualserver template (#7205)
* add auth_jwt_claim_set in nginx plus virtualserver template
1 parent 7015f55 commit ba0b287

File tree

4 files changed

+184
-0
lines changed

4 files changed

+184
-0
lines changed

internal/configs/version2/__snapshots__/templates_test.snap

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2257,6 +2257,53 @@ server {
22572257

22582258

22592259

2260+
}
2261+
2262+
---
2263+
2264+
[TestExecuteVirtualServerTemplate_RendersTemplateWithRateLimitJWTClaim - 1]
2265+
2266+
auth_jwt_claim_set $jwt_default_webapp_group_consumer_group_type consumer_group type
2267+
map $jwt_default_webapp_group_consumer_group_type $rate_limit_default_webapp_group_consumer_group_type {
2268+
default Group3;
2269+
Gold Group1;
2270+
Silver Group2;
2271+
Bronze Group3;
2272+
}
2273+
map $rate_limit_default_webapp_group_consumer_group_type $http_gold {
2274+
default '';
2275+
Group1 $jwt_claim_sub;
2276+
}
2277+
map $rate_limit_default_webapp_group_consumer_group_type $http_silver {
2278+
default '';
2279+
Group2 $jwt_claim_sub;
2280+
}
2281+
map $rate_limit_default_webapp_group_consumer_group_type $http_bronze {
2282+
default '';
2283+
Group3 $jwt_claim_sub;
2284+
}
2285+
# HTTP snippet
2286+
limit_req_zone $url zone=pol_rl_test_test_test:10m rate=10r/s;
2287+
2288+
server {
2289+
listen 80;
2290+
listen [::]:80;
2291+
2292+
2293+
server_name example.com;
2294+
status_zone example.com;
2295+
set $resource_type "virtualserver";
2296+
set $resource_name "";
2297+
set $resource_namespace "";
2298+
2299+
server_tokens "off";
2300+
limit_req_log_level error;
2301+
limit_req_status 503;
2302+
limit_req zone=pol_rl_test_test_test burst=5 delay=10;
2303+
2304+
2305+
2306+
22602307
}
22612308

22622309
---

internal/configs/version2/http.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ type VirtualServerConfig struct {
1818
KeyVals []KeyVal
1919
LimitReqZones []LimitReqZone
2020
Maps []Map
21+
AuthJwtClaimSet []AuthJwtClaimSet
2122
Server Server
2223
SpiffeCerts bool
2324
SpiffeClientCerts bool
@@ -28,6 +29,12 @@ type VirtualServerConfig struct {
2829
StaticSSLPath string
2930
}
3031

32+
// AuthJwtClaimSet defines the values for the `auth_jwt_claim_set` directive
33+
type AuthJwtClaimSet struct {
34+
Variable string
35+
Claims string
36+
}
37+
3138
// Upstream defines an upstream.
3239
type Upstream struct {
3340
Name string

internal/configs/version2/nginx-plus.virtualserver.tmpl

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ split_clients {{ $sc.Source }} {{ $sc.Variable }} {
5050
}
5151
{{- end }}
5252

53+
{{- range $claim := .AuthJwtClaimSet }}
54+
auth_jwt_claim_set {{ $claim.Variable }} {{ $claim.Claims}}
55+
{{- end }}
56+
5357
{{- range $m := .Maps }}
5458
map {{ $m.Source }} {{ $m.Variable }} {
5559
{{- range $p := $m.Parameters }}

internal/configs/version2/templates_test.go

Lines changed: 126 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,34 @@ func TestExecuteVirtualServerTemplate_RendersTemplateWithServerGunzipNotSet(t *t
9393
t.Log(string(got))
9494
}
9595

96+
func TestExecuteVirtualServerTemplate_RendersTemplateWithRateLimitJWTClaim(t *testing.T) {
97+
t.Parallel()
98+
executor := newTmplExecutorNGINXPlus(t)
99+
got, err := executor.ExecuteVirtualServerTemplate(&virtualServerCfgWithRateLimitJWTClaim)
100+
if err != nil {
101+
t.Error(err)
102+
}
103+
wantedStrings := []string{
104+
"auth_jwt_claim_set",
105+
"$rate_limit_default_webapp_group_consumer_group_type",
106+
"$jwt_default_webapp_group_consumer_group_type",
107+
"Group1",
108+
"Group2",
109+
"Group3",
110+
"$http_bronze",
111+
"$http_silver",
112+
"$http_gold",
113+
}
114+
for _, value := range wantedStrings {
115+
if !bytes.Contains(got, []byte(value)) {
116+
t.Errorf("didn't get `%s`", value)
117+
}
118+
}
119+
120+
snaps.MatchSnapshot(t, string(got))
121+
t.Log(string(got))
122+
}
123+
96124
func TestExecuteVirtualServerTemplate_RendersTemplateWithSessionCookieSameSite(t *testing.T) {
97125
t.Parallel()
98126
executor := newTmplExecutorNGINXPlus(t)
@@ -1539,6 +1567,104 @@ var (
15391567
},
15401568
}
15411569

1570+
virtualServerCfgWithRateLimitJWTClaim = VirtualServerConfig{
1571+
LimitReqZones: []LimitReqZone{
1572+
{
1573+
ZoneName: "pol_rl_test_test_test", Rate: "10r/s", ZoneSize: "10m", Key: "$url",
1574+
},
1575+
},
1576+
Upstreams: []Upstream{},
1577+
AuthJwtClaimSet: []AuthJwtClaimSet{
1578+
{
1579+
Variable: "$jwt_default_webapp_group_consumer_group_type",
1580+
Claims: "consumer_group type",
1581+
},
1582+
},
1583+
Maps: []Map{
1584+
{
1585+
Source: "$jwt_default_webapp_group_consumer_group_type",
1586+
Variable: "$rate_limit_default_webapp_group_consumer_group_type",
1587+
Parameters: []Parameter{
1588+
{
1589+
Value: "default",
1590+
Result: "Group3",
1591+
},
1592+
{
1593+
Value: "Gold",
1594+
Result: "Group1",
1595+
},
1596+
{
1597+
Value: "Silver",
1598+
Result: "Group2",
1599+
},
1600+
{
1601+
Value: "Bronze",
1602+
Result: "Group3",
1603+
},
1604+
},
1605+
},
1606+
{
1607+
Source: "$rate_limit_default_webapp_group_consumer_group_type",
1608+
Variable: "$http_gold",
1609+
Parameters: []Parameter{
1610+
{
1611+
Value: "default",
1612+
Result: "''",
1613+
},
1614+
{
1615+
Value: "Group1",
1616+
Result: "$jwt_claim_sub",
1617+
},
1618+
},
1619+
},
1620+
{
1621+
Source: "$rate_limit_default_webapp_group_consumer_group_type",
1622+
Variable: "$http_silver",
1623+
Parameters: []Parameter{
1624+
{
1625+
Value: "default",
1626+
Result: "''",
1627+
},
1628+
{
1629+
Value: "Group2",
1630+
Result: "$jwt_claim_sub",
1631+
},
1632+
},
1633+
},
1634+
{
1635+
Source: "$rate_limit_default_webapp_group_consumer_group_type",
1636+
Variable: "$http_bronze",
1637+
Parameters: []Parameter{
1638+
{
1639+
Value: "default",
1640+
Result: "''",
1641+
},
1642+
{
1643+
Value: "Group3",
1644+
Result: "$jwt_claim_sub",
1645+
},
1646+
},
1647+
},
1648+
},
1649+
HTTPSnippets: []string{"# HTTP snippet"},
1650+
Server: Server{
1651+
ServerName: "example.com",
1652+
StatusZone: "example.com",
1653+
ServerTokens: "off",
1654+
LimitReqs: []LimitReq{
1655+
{
1656+
ZoneName: "pol_rl_test_test_test",
1657+
Delay: 10,
1658+
Burst: 5,
1659+
},
1660+
},
1661+
LimitReqOptions: LimitReqOptions{
1662+
LogLevel: "error",
1663+
RejectCode: 503,
1664+
},
1665+
},
1666+
}
1667+
15421668
virtualServerCfgWithWAFApBundle = VirtualServerConfig{
15431669
Server: Server{
15441670
ServerName: "example.com",

0 commit comments

Comments
 (0)