关于 access-control-rbac
用于设计细粒度访问控制的技能,介绍 RBAC、ABAC 等模型,并提供 Node.js、Python 和 Java Spring Security 的实现指引及安全实践。
主要功能
- 01比较 RBAC、ABAC 等模型
- 02Node.js RBAC 实现模式
- 03Python ABAC 策略模式
- 04Java Spring Security 指引
- 05访问控制最佳实践
适用场景
- 01为应用权限选择控制模型
- 02在 Node.js 中实现基于角色的授权
- 03在 Python 中定义基于属性的策略
- 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