Skip to main content
skill CX Codex

rbac-permissions-builder — Claude Code skill: setup and guide

Generates a complete role-based access control architecture in TypeScript: permission matrices, Express route guards, policy classes, and UI checks.

Install into Claude Code · Skills CLI (Vercel) All methods and platforms ↓
npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a claude-code
Open on GitHub

What rbac-permissions-builder does

This skill guides the agent through building role-based authorization systems. It produces a granular resource:action permission enum alongside a role mapping table. For backend routing, it writes Express middleware like requirePermission and requireOwnership, returning standard 401 or 403 HTTP status codes.

Complex business logic moves into static policy classes like UserPolicy. The skill also outlines client-side integration: an auth endpoint returning active user permissions and a usePermission hook to toggle UI elements.

The code examples target TypeScript and Express. Route guards depend directly on an authentication layer that populates req.user, rejecting requests with 401 if that object is missing.

What it helps with

  • map granular permissions to roles using a TypeScript matrix
  • secure Express endpoints using permission-based route guards
  • verify resource ownership while preserving admin overrides
  • render frontend actions conditionally based on user permissions

Example prompts for the agent

  • Design an RBAC setup with user, moderator, and admin roles
  • Write Express middleware to protect user deletion routes with permissions
  • Create a UserPolicy class with rules for profile updates

How to install rbac-permissions-builder

1Skills CLI (Vercel)

npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a claude-code

2Manually: put the files in place

~/.claude/skills/rbac-permissions-builder/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/rbac-permissions-builder/

Step by step, with commands for each platform: How to install skills in Claude Code: five ways

Questions about rbac-permissions-builder

How to install rbac-permissions-builder in Claude Code?

Run npx skills add patricio0312rev/skills --skill rbac-permissions-builder -a claude-code. The skill file will be placed in ~/.claude/skills/rbac-permissions-builder/SKILL.md.

What does rbac-permissions-builder do?

It generates role matrices, route guards, ownership checks, policy classes, and frontend permission helpers for TypeScript applications.

What prerequisites does the generated RBAC code need?

The patterns are structured for TypeScript and Express. The route guards expect prior authentication middleware to populate req.user before checking permissions.

Source text

SKILL.md · MIT
---
name: rbac-permissions-builder
description: Implements role-based access control with permission matrix, route guards, policy functions, and UI permission hints. Provides middleware/guards, helper utilities, test suggestions, and permission checking patterns. Use when building "RBAC", "permissions", "access control", or "authorization".
---

# RBAC/Permissions Builder

Implement flexible role-based access control systems.

## Permission Matrix

```typescript
// Define permissions
export enum Permission {
  USER_READ = "user:read",
  USER_WRITE = "user:write",
  USER_DELETE = "user:delete",
  POST_READ = "post:read",
  POST_WRITE = "post:write",
  ADMIN_ACCESS = "admin:access",
}

// Define roles
export const ROLE_PERMISSIONS = {
  user: [Permission.USER_READ, Permission.POST_READ, Permission.POST_WRITE],
  moderator: [...userPermissions, Permission.POST_DELETE],
  admin: Object.values(Permission), // All permissions
};

// Check permission
export const hasPermission = (user: User, permission: Permission): boolean => {
  return ROLE_PERMISSIONS[user.role]?.includes(permission) ?? false;
};
```

## Route Guards (Express)

```typescript
export const requirePermission = (...permissions: Permission[]) => {
  return (req: Request, res: Response, next: NextFunction) => {
    if (!req.user) {
      return res.status(401).json({ error: "Unauthorized" });
    }

    const hasAllPermissions = permissions.every((p) =>
      hasPermission(req.user, p)
    );

    if (!hasAllPermissions) {
      return res.status(403).json({ error: "Forbidden" });
    }

    next();
  };
};

// Usage
router.delete(
  "/users/:id",
  authenticate,
  requirePermission(Permission.USER_DELETE),
  controller.delete
);
```

## Policy Pattern

```typescript
// policies/user.policy.ts
export class UserPolicy {
  static canUpdate(currentUser: User, targetUser: User): boolean {
    // Users can update themselves
    if (currentUser.id === targetUser.id) return true;

    // Admins can update anyone
    if (hasPermission(currentUser, Permission.USER_WRITE)) return true;

    return false;
  }

  static canDelete(currentUser: User, targetUser: User): boolean {
    // Can't delete yourself
    if (currentUser.id === targetUser.id) return false;

    // Only admins can delete
    return hasPermission(currentUser, Permission.USER_DELETE);
  }
}

// Usage in controller
if (!UserPolicy.canUpdate(req.user, targetUser)) {
  return res.status(403).json({ error: "Cannot update this user" });
}
```

## Resource Ownership

```typescript
export const requireOwnership = (
  getResourceUserId: (req: Request) => Promise<string>
) => {
  return async (req: Request, res: Response, next: NextFunction) => {
    const resourceUserId = await getResourceUserId(req);

    // Owner can access
    if (req.user.id === resourceUserId) {
      return next();
    }

    // Admin can access anything
    if (hasPermission(req.user, Permission.ADMIN_ACCESS)) {
      return next();
    }

    return res.status(403).json({ error: "Forbidden" });
  };
};
```

## UI Permission Hints

```typescript
// Return permissions with user
GET /api/me
{
  "user": { ... },
  "permissions": ["user:read", "post:write"]
}

// Frontend helper
export const usePermission = (permission: Permission): boolean => {
  const { user } = useAuth();
  return user?.permissions?.includes(permission) ?? false;
};

// Usage
{usePermission('user:delete') && <DeleteButton />}
```

## Best Practices

- Define permissions granularly (resource:action)
- Check at multiple layers (route, controller, UI)
- Use policies for complex rules
- Cache permission checks
- Log permission denials
- Test all permission paths

## Output Checklist

- [ ] Permission enum/constants
- [ ] Role-to-permission mapping
- [ ] Route guard middleware
- [ ] Policy classes for complex rules
- [ ] Ownership checking utilities
- [ ] Permission checking helpers
- [ ] UI permission hints endpoint
- [ ] Test cases for all permission paths

© patricio0312rev · MIT · patricio0312rev/skills

Similar skills

All skills for Security →

From the same set42

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor