mcpField
R
rbac-permissions-builder

rbac-permissions-builder

github.com/patricio0312revセキュリティ63322 回インストール41 週間前に更新
リポジトリ

rbac-permissions-builder について

rbac-permissions-builderは、柔軟なロールベースアクセス制御を実装する開発者向けのスキルです。権限マッピング、ルート検査、ポリシールール、リソース所有権の確認を扱います。

主な機能

  1. 01細かな権限とロールの対応付け
  2. 02Expressのルートガード
  3. 03ポリシークラスによる複雑なルール処理
  4. 04リソース所有権の確認
  5. 05フロントエンド向け権限ヒント

活用シーン

  1. 01Expressルートへの権限チェック追加
  2. 02ユーザーと管理者のアクセス方針の実装
  3. 03ユーザー自身のリソースへのアクセス制限

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/patricio0312rev/skills --skill rbac-permissions-builder

インストール後、Claude Code で/rbac-permissions-builderを入力して読み込まれたか確認します。

詳細

RBAC/権限ビルダー

柔軟なロールベースのアクセス制御システムを実装します。

権限マトリックス

// 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;
};

ルートガード(Express)

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
);

ポリシーパターン

// 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" });
}

リソースの所有権

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 の権限ヒント

// 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 />}

ベストプラクティス

  • 権限を細かく定義します(resource:action)
  • 複数の層(ルート、コントローラー、UI)でチェックします
  • 複雑なルールにはポリシーを使用します
  • 権限チェックをキャッシュします
  • 権限拒否をログに記録します
  • すべての権限パスをテストします

出力チェックリスト

  • 権限の enum/定数
  • ロールと権限のマッピング
  • ルートガードのミドルウェア
  • 複雑なルール用のポリシークラス
  • 所有権チェック用ユーティリティ
  • 権限チェック用ヘルパー
  • UI の権限ヒント用エンドポイント
  • すべての権限パスのテストケース

コメント