mcpField
A
access-control-rbac

access-control-rbac

github.com/secondskySecurity240381 installsUpdated 5w ago
Repository

About access-control-rbac

A skill for designing fine-grained access control with RBAC, ABAC, and related models. It provides implementation guidance for Node.js, Python, and Java Spring Security, alongside security practices.

Key features

  1. 01Compare RBAC, ABAC, and other models
  2. 02Node.js RBAC implementation pattern
  3. 03Python ABAC policy pattern
  4. 04Java Spring Security guidance
  5. 05Access-control best practices

Use cases

  1. 01Choose a model for application permissions
  2. 02Implement role-based authorization in Node.js
  3. 03Define attribute-based policies in Python
  4. 04Configure method-level security in Spring

Install

Copy the command and run it in a terminal.

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

After installing, type/access-control-rbacin Claude Code to confirm it loaded.

Bundled filesreferences/java-spring-security.mdreferences/python-abac.md

Details

From the project README

Access Control & RBAC

Implement secure access control systems with fine-grained permissions using RBAC, ABAC, or hybrid approaches.

Access Control Models

ModelDescriptionBest For
RBACRole-based - users assigned to roles with permissionsMost applications
ABACAttribute-based - policies evaluate user/resource attributesComplex rules
MACMandatory - system-enforced classification levelsGovernment/military
DACDiscretionary - resource owners control accessFile systems
ReBACRelationship-based - access via entity relationshipsSocial apps

Node.js RBAC Implementation

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 Pattern

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

See references/python-abac.md for complete implementation with Flask integration.

Java Spring Security

See references/java-spring-security.md for enterprise implementation with:

  • Spring Security configuration
  • Method-level security with @PreAuthorize
  • Custom permission service
  • Custom security expressions

Best Practices

Do:

  • Apply least privilege principle
  • Use role hierarchies to reduce duplication
  • Audit all access changes
  • Review permissions quarterly
  • Cache permission checks for performance
  • Separate authentication from authorization

Don't:

  • Hardcode permission checks
  • Allow permission creep without review
  • Skip audit logging
  • Use overly broad wildcards

References

Comments

Markdown supported