2016-09-23 7 views
0

Node.js RESTful APIにはループバックを使用しています。特定のレコード/オブジェクトのみへのアクセスを特定のユーザーに制限するために、モデル上で生まれたAccess Control Listsプロパティを利用できるかどうかは疑問です。私はそれが可能であり、私たち自身のロジックを実装する必要はないことを望んでいます。我々は(Postgresの中で)そのような2つのテーブルを持っていると言う: - のみ特定のレコードへのユーザアクセスを制限ループバックのアクセス制御リストを使用してテーブルレコードへのアクセスを制限します

contracts 
| id | name | manager_id | 
|----|------|-------------| 
| 1 | a | 4   | 
| 2 | b | 5   | 
| 3 | c | 6   | 

contract_managers 
| id | name | 
|----|------| 
| 4 | e | 
| 5 | f | 
| 6 | g | 

私たちが欲しいのは契約テーブルにローレベルのアクセス制御を実装することです。ドキュメントを考えると、ACLだけを使用して特定のレコードへのアクセスを制限できるかどうかはまだはっきりしていません。

誰かが私たちのアプリケーションにログインしており、contract_managerである場合、manager_idがログインしているユーザーIDであるレコードの契約テーブルからレコードを読み取ることができるようにします。たとえば、私がログインしているユーザID = 4の場合、私はcontract_managerなので、manager_id = 4のコントラクトテーブルからしか読み込めません。

これを実装する方法はありますかACLを使った単純なロジック?あるいは、カスタムロジックを作成する必要がありますか?

答えて

1

custom role resolverを定義し、そのロールで特定のアクセスを制限するACLエントリを追加すると、これを行うことができます。

Role.registerResolver('$manager', function (role, ctx, callback) { 
    if (ctx.modelName === 'Contract') { 
    app.models.Contract.count({ 
     id: ctx.modelId, 

     // I'm assuming the ContractManager model extends User model. 
     // If instead there's a relation between ContractManager and User, 
     // Use include and scopes to filter it. 
     managerId: ctx.accessToken.userId, 
    }, function(err, count) { 
     if (err) { 
     callback(err); 
     } else if (count) { 
     callback(); 
     } else { 
     callback(new Error('Not Manager')); 
     } 
    }); 
    } else if (ctx.modelName === 'ContractManager') { 

    // Again making the same assumption about ContractManager. Chnage 
    // accordingly. 
    if (ctx.accessToken.userId === ctx.modelId) { 
     callback(); 
    } else { 
     process.nextTick(() => callback(new Error('Not Manager'))); 
    } 
    } else { 
    process.nextTick(() => callback(new Error('Only for ContractManager or Contract'))); 
    } 
} 

次に、あなたは(それをより具体的にするお気軽に)このACLを追加する必要があります。

{ 
    "accessType": "*", 
    "principalType": "ROLE", 
    "principalId": "$manager", 
    "permission": "ALLOW", 
    "property": "*", 
    "model": "*" 
} 

は今、この役割リゾルバは、プロトタイプの方法(すなわちfindById、/api/Contract/{id})でのみ動作していないことに注意してください静的メソッド(例:find、/api/Contract)では、ctx.modelIdを使用します。これはプロトタイプメソッド呼び出しでのみ使用できます。

関連する問題