Implementing Authorization
1. Setting Up Role-Based Access Control (RBAC)
| Component | Example |
|---|---|
| Role | admin, editor, viewer |
| Permission | orders:read, orders:write |
| Assignment | User → Role(s) → Permissions |
| Storage | JWT roles claim or RBAC service |
Example: Role check (Lua)
local roles = kong.ctx.shared.jwt_payload.roles or {}
local required = "admin"
local allowed = false
for _, r in ipairs(roles) do
if r == required then allowed = true break end
end
if not allowed then
return kong.response.exit(403, { error = "forbidden" })
end
2. Using Attribute-Based Access Control (ABAC)
| Attribute Type | Example |
|---|---|
| Subject | user.dept, user.clearance |
| Resource | resource.owner, resource.tier |
| Action | read, write, delete |
| Environment | time.now, request.ip |
3. Implementing Policy-Based Authorization
Example: OPA Rego policy
package http.authz
default allow = false
allow {
input.method == "GET"
input.path[0] == "v1"
input.path[1] == "orders"
token.payload.scope[_] == "orders:read"
}
token := { "payload": payload } {
[_, payload, _] := io.jwt.decode(input.headers.authorization)
}4. Configuring Scope-Based Access
| Scope | Allows |
|---|---|
read:users | GET /users |
write:users | POST/PUT/PATCH /users |
delete:users | DELETE /users |
admin:* | All operations |
openid email | OIDC standard |
5. Using Claims-Based Authorization
Example: Tenant claim check
local payload = kong.ctx.shared.jwt_payload
local req_tenant = kong.request.get_query_arg("tenant")
if payload.tenant ~= req_tenant then
return kong.response.exit(403, { error = "tenant_mismatch" })
end
6. Implementing Resource-Level Permissions
| Check | Example |
|---|---|
| Ownership | resource.owner_id == user.id |
| Sharing | User in resource ACL |
| Visibility | Public/private flag |
| Group membership | User in resource's group |
7. Configuring Permission Hierarchies
super_admin
├── admin
│ ├── editor (read+write)
│ │ └── viewer (read)
│ └── moderator
└── auditor (read all, no write)
8. Setting Up Access Control Lists (ACL)
Example: ACL plugin
plugins:
- name: acl
config:
allow: ["premium-tier", "enterprise-tier"]
deny: ["banned-users"]
hide_groups_header: true
9. Using Dynamic Authorization Rules
| Source | Example |
|---|---|
| External PDP | OPA, Cedar, Zanzibar |
| Feature flags | LaunchDarkly, Unleash |
| Database | Per-tenant policy table |
| Config service | Hot-reloaded JSON rules |
10. Implementing Authorization Caching
| Cache Layer | TTL | Trade-off |
|---|---|---|
| Per-request memo | Request lifetime | None |
| Local LRU | 1-5 min | Stale revocation |
| Shared (Redis) | 5-15 min | Network hop |
| Negative cache | 30s | Limit DoS |