访问控制RBAC技能 access-control-rbac

此技能用于实现基于角色的访问控制(RBAC)系统,提供细粒度权限管理,适用于企业应用、多租户平台、管理仪表盘等场景。关键词包括:访问控制、RBAC、权限管理、安全授权、ABAC、Node.js、Python、Java、系统安全、企业架构。

架构设计 0 次安装 0 次浏览 更新于 3/8/2026

名称: 访问控制-rbac 描述: 基于角色的访问控制(RBAC),带权限和策略。用于管理仪表盘、企业访问、多租户应用、细粒度授权,或遇到权限层次、角色继承、策略冲突的场景。

访问控制与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 中间件
const requirePermission = (resource, action) => (req, res, next) => {
  if (!rbac.can(req.user.id, resource, action)) {
    return res.status(403).json({ error: '禁止访问' });
  }
  next();
};

// 设置默认角色
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' 或 '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  # 默认拒绝


# 条件函数
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

参见 references/python-abac.md 以获取完整的Flask集成实现。

Java Spring Security

参见 references/java-spring-security.md 以获取企业级实现,包括:

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

最佳实践

应做:

  • 应用最小权限原则
  • 使用角色层次减少重复
  • 审计所有访问变更
  • 每季度审查权限
  • 缓存权限检查以提高性能
  • 将认证与授权分开

不应做:

  • 硬编码权限检查
  • 允许权限漂移而不审查
  • 跳过审计日志记录
  • 使用过于宽泛的通配符

参考文献