关于 rbac-permissions-builder
rbac-permissions-builder 是用于实现灵活基于角色的访问控制的技能,面向构建权限系统的开发者。内容涵盖权限映射、路由检查、策略规则和资源所有权验证。
主要功能
- 01定义细粒度权限与角色映射
- 02提供 Express 路由守卫
- 03用策略类处理复杂规则
- 04检查资源所有权
- 05向前端提供权限提示
适用场景
- 01为 Express 路由添加权限校验
- 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 />}
最佳实践
- 细粒度地定义权限(资源:操作)
- 在多个层级检查权限(路由、控制器、UI)
- 对复杂规则使用策略
- 缓存权限检查结果
- 记录权限拒绝事件
- 测试所有权限路径
输出检查清单
- 权限枚举/常量
- 角色到权限的映射
- 路由守卫中间件
- 用于复杂规则的策略类
- 所有权检查工具
- 权限检查辅助工具
- UI 权限提示端点
- 覆盖所有权限路径的测试用例
评论
支持 Markdown