2016-07-24 9 views
3

私はORM(Postgresを使って)としてsequelizeを使って、ある種の許可フレームワークをノードjsに実装しようとしています。数時間の研究の後、既存のnpmモジュールでこれを行うのに最も近いことは、aclを使用して私のスタックをサポートするためにaclを続けることです。関係に基づくノード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を正確に使用する方法を説明する記事があります。

関連する問題