前端如何实现ABAC权限控制?

上官保霞 阅读 56

我在做后台管理系统,想用ABAC模型做细粒度权限控制,但不确定前端该怎么配合。后端返回的策略是 JSON 格式,比如:

{
  "role": "editor",
  "resource": "article",
  "action": "update",
  "conditions": {
    "ownerId": "currentUserId"
  }
}

现在的问题是:我该在组件里直接写判断逻辑,还是封装一个权限检查函数?试过用 canUserDo('update', 'article') 这种方式,但条件里的 ownerId 怎么动态传进去啊?感觉越写越乱。

我来解答 赞 10 收藏
二维码
手机扫码查看
2 条解答
 ___成娟
建议改成封装一个权限检查函数,这样可以更好地管理和复用逻辑。你可以创建一个 checkPermission 函数,接受策略对象和当前用户的上下文信息作为参数。这样处理条件中的动态参数也会变得简单。

比如:

pre class="pure-highlightjs line-numbers">function checkPermission(policy, context) {
const { role, resource, action, conditions } = policy;

// 检查基本的 role, resource, action
if (!hasBasicPermission(role, resource, action)) {
return false;
}

// 检查条件
for (const [key, value] of Object.entries(conditions)) {
if (value === context[key]) {
continue;
}
return false;
}

return true;
}

// 使用示例
const policy = {
role: "editor",
resource: "article",
action: "update",
conditions: {
ownerId: "currentUserId"
}
};

const userContext = {
currentUserId: "123"
};

console.log(checkPermission(policy, userContext)); // 返回 true 或 false


这样每个策略的条件都可以灵活传入,逻辑也更清晰了。
点赞
2026-03-21 21:05
极客慧研
搞ABAC确实烦...建议封装个函数,把当前用户ID也传进去。差不多这样:

function checkPermission(userId, action, resource, policy) {
return policy.action === action
&& policy.resource === resource
&& (policy.conditions.ownerId ? userId === policy.conditions.ownerId : true);
}


组件里直接用就行,记得把当前用户ID存全局状态里。
点赞 2
2026-03-08 12:02