mcpField
R
rbac-permissions-builder

rbac-permissions-builder

github.com/patricio0312rev安全63322 次安装41 周前更新
代码仓库

关于 rbac-permissions-builder

rbac-permissions-builder 是用于实现灵活基于角色的访问控制的技能,面向构建权限系统的开发者。内容涵盖权限映射、路由检查、策略规则和资源所有权验证。

主要功能

  1. 01定义细粒度权限与角色映射
  2. 02提供 Express 路由守卫
  3. 03用策略类处理复杂规则
  4. 04检查资源所有权
  5. 05向前端提供权限提示

适用场景

  1. 01为 Express 路由添加权限校验
  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 />}

最佳实践

  • 细粒度地定义权限(资源:操作)
  • 在多个层级检查权限(路由、控制器、UI)
  • 对复杂规则使用策略
  • 缓存权限检查结果
  • 记录权限拒绝事件
  • 测试所有权限路径

输出检查清单

  • 权限枚举/常量
  • 角色到权限的映射
  • 路由守卫中间件
  • 用于复杂规则的策略类
  • 所有权检查工具
  • 权限检查辅助工具
  • UI 权限提示端点
  • 覆盖所有权限路径的测试用例

评论

支持 Markdown