rbac-permissions-builder について
rbac-permissions-builderは、柔軟なロールベースアクセス制御を実装する開発者向けのスキルです。権限マッピング、ルート検査、ポリシールール、リソース所有権の確認を扱います。
主な機能
- 01細かな権限とロールの対応付け
- 02Expressのルートガード
- 03ポリシークラスによる複雑なルール処理
- 04リソース所有権の確認
- 05フロントエンド向け権限ヒント
活用シーン
- 01Expressルートへの権限チェック追加
- 02ユーザーと管理者のアクセス方針の実装
- 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 の権限ヒント用エンドポイント
- すべての権限パスのテストケース
コメント
Markdown 対応