Skip to main content

Access Control

Zen provides two access control strategies - roles and granular permissions - both checked via middleware after authentication.

Strategies

StrategyScopeCheck
RBACBroad roles ("admin", "editor")RequireRole("admin")
PBACGranular permissions ("read:users")RequirePermission("read:users"), RequireAnyPermission(...), RequireAllPermissions(...)
ClaimsSpecific claim valuesRequireClaim("tenant", "acme")

See the dedicated RBAC and PBAC pages for usage details.

Setting Roles and Permissions

Roles and permissions are represented as authorities on the User struct returned by your authenticator:

func MyAuthenticator(r *http.Request) (*auth.User, error) {
return &auth.User{
ID: "123",
Username: "john",
Authorities: auth.Authorities(
"role:admin",
"role:editor",
"read:users",
"write:reports",
),
}, nil
}

Claim-Based Enforcement

Use RequireClaim when access should depend on a specific claim value:

r.Use(auth.RequireAuth(jwtAuth))
r.Use(auth.RequireClaim("tenant", "acme"))

Enforcement Order

Apply RequireAuth first, then the access control middleware:

r.Use(auth.RequireAuth(jwtAuth))
r.Use(auth.RequireRole("admin"))
r.Use(auth.RequirePermission("read:users"))
r.Use(auth.RequireClaim("tenant", "acme"))