# RBAC Base — role skeleton and shared effects # # Provides the common effect dictionary and the default fallback policy. # Feature fragments (features/*.ncl) provide permissions per role. # Compose in your site/rbac.ncl using the @ array concatenation operator. # # Usage: # let base = import "rustelo/resources/nickel/rbac/rbac-base.ncl" in # let auth = import "rustelo/resources/nickel/rbac/features/auth.ncl" in # let content = import "rustelo/resources/nickel/rbac/features/content.ncl" in # # { groups = [ # { name = "admin", ..., permissions = auth.admin @ content.admin }, # { name = "user", ..., permissions = auth.user @ content.user }, # { name = "guest", ..., permissions = auth.guest @ content.guest }, # ], # defaults = base.defaults & { unauthenticated_allow = [ ...site-specific... ] }, # } | C.FileRbacConfig | RoleNamesConsistent { # Reusable effect sets — import and reference as E.redirect_login, etc. effects = { redirect_login = [{ type = "redirect", to = "/login?return={request.path}" }], audit_deny = [{ type = "audit_log", event = "access_denied", level = "warn" }], audit_allow = [{ type = "audit_log", event = "access_granted", level = "info" }], api_forbidden = [{ type = "response", status = 403, body.error = "Forbidden" }], log_warn = [{ type = "log", level = "warn", message = "Denied: {request.path}" }], security_alert = [{ type = "notify", channel = "security", message = "Access: {request.path} by {user.email}", }], }, # Minimal defaults — override unauthenticated_allow in your site/rbac.ncl defaults = { unauthenticated_allow = [], unauthenticated_deny = [], authenticated_fallback = "deny", unauthenticated_fallback = "deny", fallback_effects = [{ type = "log", level = "warn", message = "Denied: {request.path}" }], }, }