mcpField
A
access-control-rbac

access-control-rbac

github.com/secondsky安全240381 次安装5 周前更新
代码仓库

关于 access-control-rbac

用于设计细粒度访问控制的技能,介绍 RBAC、ABAC 等模型,并提供 Node.js、Python 和 Java Spring Security 的实现指引及安全实践。

主要功能

  1. 01比较 RBAC、ABAC 等模型
  2. 02Node.js RBAC 实现模式
  3. 03Python ABAC 策略模式
  4. 04Java Spring Security 指引
  5. 05访问控制最佳实践

适用场景

  1. 01为应用权限选择控制模型
  2. 02在 Node.js 中实现基于角色的授权
  3. 03在 Python 中定义基于属性的策略
  4. 04配置 Spring 方法级安全

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/secondsky/claude-skills --skill access-control-rbac

安装后在 Claude Code 中输入/access-control-rbac确认已加载。

附带文件references/java-spring-security.mdreferences/python-abac.md

详细介绍

访问控制与 RBAC

使用 RBAC、ABAC 或混合方案实现具有细粒度权限的安全访问控制系统。

访问控制模型

模型描述最适用于
RBAC基于角色:为用户分配具有相应权限的角色大多数应用程序
ABAC基于属性:根据用户/资源属性评估策略复杂规则
MAC强制访问控制:由系统强制执行分级级别政府/军事领域
DAC自主访问控制:由资源所有者控制访问文件系统
ReBAC基于关系:通过实体关系控制访问社交应用

Node.js RBAC 实现

class Permission {
  constructor(resource, action) {
    this.resource = resource;
    this.action = action;
  }

  matches(resource, action) {
    return (this.resource === '*' || this.resource === resource) &&
           (this.action === '*' || this.action === action);
  }
}

class Role {
  constructor(name, permissions = [], parent = null) {
    this.name = name;
    this.permissions = permissions;
    this.parent = parent;
  }

  hasPermission(resource, action) {
    if (this.permissions.some(p => p.matches(resource, action))) return true;
    return this.parent?.hasPermission(resource, action) ?? false;
  }
}

class RBACSystem {
  constructor() {
    this.roles = new Map();
    this.userRoles = new Map();
  }

  createRole(name, permissions = [], parentRole = null) {
    const parent = parentRole ? this.roles.get(parentRole) : null;
    this.roles.set(name, new Role(name, permissions, parent));
  }

  assignRole(userId, roleName) {
    const userRoles = this.userRoles.get(userId) || [];
    userRoles.push(this.roles.get(roleName));
    this.userRoles.set(userId, userRoles);
  }

  can(userId, resource, action) {
    const roles = this.userRoles.get(userId) || [];
    return roles.some(role => role.hasPermission(resource, action));
  }
}

// Express middleware
const requirePermission = (resource, action) => (req, res, next) => {
  if (!rbac.can(req.user.id, resource, action)) {
    return res.status(403).json({ error: 'Forbidden' });
  }
  next();
};

// Setup default roles
const rbac = new RBACSystem();
rbac.createRole('viewer', [new Permission('*', 'read')]);
rbac.createRole('editor', [new Permission('*', 'write')], 'viewer');
rbac.createRole('admin', [new Permission('*', '*')], 'editor');

Python ABAC 模式

class Policy:
    def __init__(self, name, effect, resource, action, conditions):
        self.name = name
        self.effect = effect  # 'allow' or 'deny'
        self.resource = resource
        self.action = action
        self.conditions = conditions

    def matches(self, context):
        if self.resource != "*" and self.resource != context.get("resource"):
            return False
        if self.action != "*" and self.action != context.get("action"):
            return False
        return True

    def evaluate(self, context):
        return all(cond(context) for cond in self.conditions)


class ABACEngine:
    def __init__(self):
        self.policies = []

    def add_policy(self, policy):
        self.policies.append(policy)

    def check_access(self, context):
        for policy in self.policies:
            if policy.matches(context) and policy.evaluate(context):
                return policy.effect == 'allow'
        return False  # Deny by default


# Condition functions
def is_resource_owner(ctx):
    return ctx.get("user_id") == ctx.get("resource_owner_id")

def is_within_business_hours(ctx):
    from datetime import datetime
    return 9 <= datetime.now().hour < 18

完整的 Flask 集成实现请参阅 references/python-abac.md。

Java Spring Security

企业级实现请参阅 references/java-spring-security.md,其中包括:

  • Spring Security 配置
  • 使用 @PreAuthorize 实现方法级安全
  • 自定义权限服务
  • 自定义安全表达式

最佳实践

建议:

  • 遵循最小权限原则
  • 使用角色层级减少重复
  • 审计所有访问权限变更
  • 每季度审查权限
  • 缓存权限检查以提升性能
  • 将身份验证与授权分开

避免:

  • 将权限检查硬编码
  • 未经审查便不断扩大权限
  • 跳过审计日志记录
  • 使用范围过大的通配符

参考资料

评论

支持 Markdown