一种尝试: 用 matrix 来定义项目的 ACL - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
timqian
10.02D

一种尝试: 用 matrix 来定义项目的 ACL

  •  
  •   timqian
    timqian 2018 年 2 月 6 日 2186 次点击
    这是一个创建于 3001 天前的主题,其中的信息可能已经有所发展或是发生改变。

    因为最近做的项目需要对一些资源做简单的权限管理。老项目用的是 node_acl。功能比较全,但是对于简单的 acl 也需要连数据库。于是就在想可不可以把 ACL 搞的简单一点。

    对于简单的 ACL,表达的是 role 是否被 allow 对一个 resource 做某个操作。

    这其实可以使用一个三维矩阵来: 行代表 role 列代表 resource 第三维代表权限。

    于是做了这个小库: acl-matrix

    下面复制了下 readme, 欢迎讨论

    Usage

    1. Install
    npm install acl-matrix 
    1. Require it
    const AclMatrix = require('acl-matrix'); const roles = ['admin', 'member', 'guest']; const resources = ['blog', 'comment']; const allows = ['get', 'ad', 'update', 'delete']; // Each element in matrix stores the permissions of a role to a resource. const matrix = [ // admin member guest [[1, 1, 1, 1], [1, 0, 1, 1], [1, 0, 0, 0]], // blog [[1, 1, 1, 1], [1, 1, 1, 1], [1, 1, 1, 0]], // comment ]; const acl = new AclMatrix(roles, resources, allows, matrix); // 0 acl.isAllowed('member', 'blog', 'add'); // 1 acl.isAllowed('member', 'blog', 'get'); 

    Concepts

    • roles are the types of user trying to access resources
    • allows describes the oprations user will need to do
    • matrix describes the allows relation between roles and resources;
    • third dimension of the matrix is an array of 0 and 1s, the length of array should equal to allows's. This array describes the permissions.

    For example: in the above sample code, matrix[0][2] ([1, 0, 0, 0]) means the guest role is able to 'get' the 'blog' resource, but not others.

    Parameter limits

    • Row number of matrix should eauql to resources length;
    • Collum number of matrix should eauql to role length;
    • Element number of matrix should eauql to allows length;

    Pros and Cons

    Pros

    node_acl is good, but it acquires database to store the acls. And it is relatively hard to mantain and update acl using node_acl.

    Benefits of using acl-matrix:

    1. Three dimensional matrix is the simplest way to store acl;
    2. Simple to config and simple for future change;
    3. No dependency, acl matrix can be easily shared between frontend and backend;
    4. Performance: no database needed, checking permissions is justing reading elemet in array

    Cons

    1. By using node_acl you are able to save relations between users and roles. You will need to store the role of the user youself using acl-matrix
    2. By default, permissions of each roles are fixed, which is suitable for most projects. But if you want to allow user define the acl, you will need to store multiple acl matrices

    TODOs

    Add more method for the class maybe?

    1 条回复    2018-02-06 21:00:52 +08:00
    xx19941215
        1
    xx19941215  
       2018 年 2 月 6 日
    有意思 学的矩阵都忘了。。很难想到这 楼主是数学系转的计算机吗
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2390 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 16:09 PVG 00:09 LAX 09:09 JFK 12:09
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86