2016-07-24 44 views
3

我試圖在節點js中使用sequelize作爲ORM(使用Postgres)來實現某種權限框架。經過幾個小時的研究,我發現用現有的npm模塊可以做到最接近的事情是使用acl和acl sequelize來支持我的堆棧。基於關係的節點js中的ACL

問題是,它看起來像acl模塊分配一個角色,該角色將獲得一組權限到特定資源的所有實例。但是,我需要根據該用戶的現有關係對實例進行權限。

作爲一個例子,考慮一個簡單論壇的權限系統。它使這些權限對於每個角色:

// allow guests to view posts 
    acl.allow("guest", "post", "view"); 

    // allow registered users to view and create posts 
    acl.allow("registered users", "post", ["view", "create"]); 

    // allow administrators to perform any action on posts 
    acl.allow("administrator", "post", "*"); 

假設我想也增加對註冊用戶也可以編輯自己的帖子的能力,並且用戶具有他們所創建的所有職位的關係。

有沒有什麼辦法讓這個模塊做到這一點,或任何其他模塊,可以在數據庫/ ORM級別上支持這種行爲?

如果不是,我必須實現一個自定義的,那麼創建類似這樣的最佳方法是什麼?

回答

2

還有比較新的圖書館CASL。我是這個圖書館的作者。而且有可能很容易地實現你的用例:

const { AbilityBuilder } = require('casl') 

const ability = AbilityBuilder.define((can, cannot) => { 
    can('read', 'all') 
    can(['update', 'delete'], 'Article', { author_id: loggedInUser.id }) 
}) 

上述基本的代碼表示: - 任何人都可以讀到的一切 - 任何人都可以更新和刪除文章,其中AUTHOR_ID用戶ID等於登錄

以後你可以這樣做:

ability.can('delete', 'Post') 
//or 
ability.can('update', post) 
// where post variable is an instance of your Post model 

另外還有一篇文章解釋瞭如何將CASL與MongoDB和Express整合到您的用例中。