权限系统设计(7):鉴权库casl做权限控制
Author:zhoulujun Date:
上篇《权限系统设计(6):鉴权库Casbin做权限控制 》,但是对于前端,casl更为精巧与流行
场景 | Casbin | CASL |
---|---|---|
后端权限控制 | ✅ 适合复杂权限模型(如多租户、ABAC) | ✅ 适合 Node.js 后端简单权限逻辑 |
前端权限控制 | ❌ 不直接支持前端 | ✅ 专为前端设计(隐藏 UI 元素等) |
动态策略调整 | ✅ 支持实时更新策略 | ✅ 可通过条件动态生成权限 |
跨语言一致性 | ✅ 多语言统一模型 | ❌ 仅限 JavaScript/TypeScript |
Casbin基于 PERM 模型(Policy, Effect, Request, Matchers):
策略(Policy):定义权限规则(如
p, admin, /data, GET
)。请求(Request):访问请求格式(如
sub, obj, act
)。匹配器(Matchers):逻辑判断规则(如
m = r.sub == p.sub && r.obj == p.obj
)。效果(Effect):最终决策逻辑(如
e = some(where (p.eft == allow))
)。
CASL基于能力(Ability)的声明式模型:
通过 can() 和 cannot() 定义权限(如 can('read', 'Article'))。
支持条件过滤(如 can('read', 'Article', { authorId: user.id }))。
所以CASL使用起来超级简单(Casbin认知成本太高),无需复杂配置,适合快速集成到前端或 Node.js 应用。
// ability.js
import { defineAbility } from "@casl/ability";
export default defineAbility((can, cannot) => {
can("read", "Post");
can("add", "Post");
cannot("update", "Post");
cannot("delete", "Post");
});
permission on React Component
import { createContext } from "react";
import { createContextualCan } from "@casl/react";
import ability from "./ability.js";
export const AbilityContext = createContext();
export const Can = createContextualCan(AbilityContext.Consumer);
function App() {
const post = { title: "example-title", content: "example-content" };
return (
<AbilityContext.Provider value={ability}>
<Can I="add" a="Post">
<button>Add</button>
</Can>
<Can I="read" a="Post">
<Post post={post} />
</Can>
</AbilityContext.Provider>
);
}
function Post({ post }) {
return (
<div>
<h2>{post.title}</h2>
<p>{post.content}</p>
<Can I="update" a="Post">
<button>Edit</button>
</Can>
<Can I="delete" a="Post">
<button>Delete</button>
</Can>
</div>
);
}
在路由层面控制,参看:https://gist.github.com/stalniy/5adcccf8117177078ada0454e6a6d300
参考文章:
https://dev.to/dwalsh01/managing-user-roles-in-react-using-casl-11f6
https://dev.to/naufalafif/dynamic-permissions-in-react-using-casl-a-guide-to-secure-your-app-2ino
https://gist.github.com/stalniy/5adcccf8117177078ada0454e6a6d300
转载本站文章《权限系统设计(7):鉴权库casl做权限控制》,
请注明出处:https://www.zhoulujun.cn/html/Operation/PM/2025_0221_9494.html