RBAC / ABAC 权限模型
RBAC(基于角色的访问控制)
模型结构
用户 ── 角色 ── 权限
│ │ │
│ │ └─ 资源 + 操作(如 /order:read)
│ │
│ └─ 角色层级(角色继承)
│
└─ 多角色(一个用户可拥有多个角色)数据库设计
sql
-- 用户表
CREATE TABLE sys_user (
id BIGINT PRIMARY KEY,
username VARCHAR(50)
);
-- 角色表
CREATE TABLE sys_role (
id BIGINT PRIMARY KEY,
role_code VARCHAR(50), -- ROLE_ADMIN, ROLE_USER
role_name VARCHAR(100)
);
-- 用户-角色关联
CREATE TABLE sys_user_role (
user_id BIGINT,
role_id BIGINT,
PRIMARY KEY (user_id, role_id)
);
-- 权限表
CREATE TABLE sys_permission (
id BIGINT PRIMARY KEY,
resource VARCHAR(100), -- /api/order
action VARCHAR(50) -- read / write / delete
);
-- 角色-权限关联
CREATE TABLE sys_role_permission (
role_id BIGINT,
permission_id BIGINT,
PRIMARY KEY (role_id, permission_id)
);实现示例
java
@Component
public class RbacPermissionEvaluator implements PermissionEvaluator {
@Override
public boolean hasPermission(Authentication auth,
Object target, Object permission) {
String resource = (String) target; // /api/order
String action = (String) permission; // read
// 查询用户角色关联的权限
Set<String> perms = loadUserPermissions(auth.getName());
return perms.contains(resource + ":" + action);
}
}
// 使用
@PreAuthorize("hasPermission('/api/order', 'read')")
public List<Order> listOrders() { ... }ABAC(基于属性的访问控制)
模型结构
请求主体属性 + 资源属性 + 环境属性
│ │ │
└──────────────┴────────────┘
│
┌──────▼──────┐
│ 策略引擎 │
│ Policy XACML│
└──────┬──────┘
│
┌──────▼──────┐
│ 允许 / 拒绝 │
└─────────────┘策略示例
json
{
"policyId": "order-access",
"rules": [
{
"effect": "deny",
"condition": {
"subject.role": "visitor",
"resource.type": "order",
"environment.time": { "before": "09:00", "after": "18:00" }
}
},
{
"effect": "allow",
"condition": {
"subject.role": "admin",
"resource.type": "order"
}
},
{
"effect": "allow",
"condition": {
"subject.id": "resource.ownerId",
"resource.type": "order"
}
}
]
}实现示例
java
@Component
public class AbacPolicyEngine {
public boolean evaluate(Subject subject, Resource resource, Environment env) {
// 加载策略
List<Policy> policies = loadPolicies(resource.getType());
for (Policy policy : policies) {
if (policy.effect == Effect.DENY && matchCondition(policy, subject, resource, env)) {
return false; // deny 优先
}
}
for (Policy policy : policies) {
if (policy.effect == Effect.ALLOW && matchCondition(policy, subject, resource, env)) {
return true;
}
}
return false; // 默认拒绝
}
}RBAC vs ABAC
| 维度 | RBAC | ABAC |
|---|---|---|
| 粒度 | 角色粗粒度 | 属性细粒度 |
| 灵活性 | 增加角色可扩展 | 任意条件组合 |
| 规则数量 | 适合少量角色 | 支持大量动态规则 |
| 运维成本 | 低 | 高(策略管理复杂) |
| 性能 | 快(缓存预加载) | 中(运行时评估) |
| 适用场景 | 企业后台管理 | 云平台 / IoT / 金融风控 |