• home > OMD > PM >

    权限系统设计(7):鉴权库casl做权限控制

    Author:zhoulujun Date:

    An isomorphic authorization JavaScript library which restricts what resources a given user is allowed to access.

    上篇《权限系统设计(6):鉴权库Casbin做权限控制 》,但是对于前端,casl更为精巧与流行

    官网:https://casl.js.org/v6/en/

    场景CasbinCASL
    后端权限控制✅ 适合复杂权限模型(如多租户、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