skills/rbac/SKILL.md
Permission and access control (RBAC/ABAC/ReBAC).
npx skillsauth add arbazkhan971/godmode rbacInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
/godmode:rbac, "permissions", "access control"App type: monolith|microservices|multi-tenant SaaS
Complexity:
Simple roles (admin/user/viewer) -> RBAC
Dynamic attributes (time/location) -> ABAC
Resource relationships (owner/member) -> ReBAC
Combination -> Hybrid
# Detect existing auth/authz
grep -rl "role\|permission\|authorize\|can\?" \
--include="*.ts" --include="*.rb" --include="*.py" src/
RBAC (Role-Based):
Role hierarchy:
super_admin -> org_admin -> team_admin -> member
Permissions: create|read|update|delete per resource
Role-permission mapping table
IF roles < 10 and stable: pure RBAC is sufficient.
ABAC (Attribute-Based):
Policy: (Subject, Resource, Action, Environment) -> PERMIT|DENY
Subject: user.role, user.department, user.clearance
Resource: resource.owner, resource.classification
Environment: time, IP, MFA status
IF decisions depend on context (time, location): ABAC.
ReBAC (Relationship-Based):
Tuples: user:alice has owner on document:doc1
Inheritance: owner implies editor implies viewer
Tools: OpenFGA, SpiceDB, Ory Keto
IF Google Docs-style sharing model: ReBAC.
Strict (tree): each role has one parent
Lattice (DAG): roles can have multiple parents
Scoped: roles apply within scope (org/team/project)
IF > 20 roles: audit for overlap and consolidate. IF unused permissions for 90+ days: flag as excessive.
Every resource has:
owner_id (full control)
tenant_id (isolation boundary)
visibility: private|team|organization|public
Evaluation chain:
1. Owner? -> ALLOW
2. Super admin? -> ALLOW (audit logged)
3. Explicit permission? -> Check
4. Role-based? -> Check hierarchy
5. ABAC policy? -> Evaluate
6. Default: DENY
function evaluate(subject, resource, action, context):
denials = findMatchingPolicies(DENY, ...)
IF denials.length > 0: return DENY
allows = findMatchingPolicies(ALLOW, ...)
IF allows.length > 0: return ALLOW
return DENY # default deny
LOG every decision (ALLOW and DENY) with full context.
Every authorization decision logged:
timestamp, subject, resource, action,
decision (allow/deny), policy_id, reason
Storage: append-only or write-once
Retention: minimum 1 year for compliance
IF audit log not append-only: security risk. IF no audit log: MUST implement before launch.
<!-- tier-3 -->Append .godmode/rbac-decisions.tsv:
timestamp model roles permissions resources audit verdict
KEEP if: permission checks pass AND no escalation
AND audit captures allow/deny.
DISCARD if: unauthorized access possible OR
audit broken OR permissions regressed.
STOP when FIRST of:
- All resources have permission mappings
- Default deny enforced every endpoint
- Audit logging covers all decisions
On failure: git reset --hard HEAD~1. Never pause.
| Failure | Action | |--|--| | Legitimate request denied | Check audit log, verify hierarchy | | Escalation possible | Fix policy, test both directions | | Missing audit entries | Verify middleware, check async flush |
development
Web performance optimization. Lighthouse, bundle analysis, code splitting, image optimization, critical CSS, fonts, service workers, CDN.
development
Webhook design, delivery, retry, HMAC verification, event subscriptions, dead letter queues.
development
Vue.js mastery. Composition API, Pinia, Vue Router, Nuxt SSR/SSG, Vite optimization, testing.
development
Evidence gate. Run command, read full output, confirm or deny claim. No trust, only proof.