17

次のような config/policies.js でセイルのポリシーを構成する場合:

    ActivityController: {
        create: ['authenticated'],
        update: ['authenticated', 'isActivityOwner'],
        destroy: ['authenticated' ,'isActivityOwner']
    }

ポリシーのグループの 1 つ以上が成功した場合にアクションへのアクセスを許可できる機能はありますか?

    ActivityController: {
        create: ['authenticated'],
        update: ['authenticated', {or:['isActivityOwner', 'isAdmin']}],
        destroy: ['authenticated' ,'isActivityOwner']
    }

あるいは、複合ポリシーを作成して、1 つのポリシーで 1 つ以上の他のポリシーをチェックできるようにすることはできますか?

これらのオプションの両方が不十分な解決策のように思われる場合、より良い方法と見なされるアプローチを提案できますか?

これが少し明白である場合は許してください。しかし、私はセイルとノード全般にかなり慣れていないため、事前に助けてくれてありがとう!

4

5 に答える 5

5

ポリシーにパラメーターを追加できるように帆フックを作成しました:
https://github.com/mastilver/sails-hook-parametized-policies

orポリシーを定義した例をセットアップしました。

module.exports = function(firstPolicy, secondPolicy){

    return function(req, res, next){


        var fakeRes = {};

        for(var i in res){
            if(i === 'forbidden'){
                // override the functions you want the `or` factory to handle
                fakeRes[i] = function(){
                    secondPolicy(req, res, next);
                };
            }
            else{
                fakeRes[i] = res[i];
            }
        }


        firstPolicy(req, fakeRes, next);
    }
}

そのように使用できるもの:

ActivityController: {
        create: ['authenticated'],
        update: ['authenticated', 'or(isActivityOwner, isAdmin)'],
        destroy: ['authenticated' ,'isActivityOwner']
    }
于 2015-06-21T19:07:06.810 に答える
1

前の回答を完了するだけで、それは魅力のように機能します:


情報

ただし、セッション変数にブール値も設定します

私自身は、このブール値をreqオブジェクトに設定することを好みます。

  • よりセマンティックです (セッション全体ではなく、リクエストのリソースへのアクセスが許可されているかどうか)
  • この変数を手動でリセットする必要はありません (@Travis ソリューションのようにセッションを使用したい場合は、次のリクエストを保護するために、最後のorPolicyポリシーをリセット (設定解除も) する必要があることを追加する必要があります)variable

私の実装

config/policies.js :

MyController: {
  find: ['orIsTest1', 'orIsTest2', 'protectedResourceGranted']
}

api/policies/orIsTest1.js :

module.exports = function(req, res, next) {
  req.protectedResourceGranted = req.protectedResourceGranted || WHATEVERFIRSTTEST;

  return next();
};

API/ポリシー/orIsTest2.js

module.exports = function(req, res, next) {
  req.protectedResourceGranted = req.protectedResourceGranted || WHATEVERSECONDTEST;

  return next();
};

api/policies/protectedResourceGranted.js

module.exports = function(req, res, next) {
  if(req.protectedResourceGranted) {
    return next();
  }

  return res.forbidden();
};

注意: コメントするのに十分な評判が得られていないので、ただ答えるだけです。

于 2015-03-18T09:43:08.687 に答える
0

ここでの他の答えはうまく機能しますが、これは私が少しきれいだと思う実装です。

失敗しても呼び出されるOR状況向けに設計されたポリシーを作成する代わりに、動作をほとんど変更せずに、 AND / ORコンテキストで使用するように既存のポリシーを変更できます。次に、変更された既存のポリシーをチェックする複合ポリシー (OP が提案したようなもの) を作成します。next()

config/policies.jsには、コントローラーとポリシーの例が含まれています。

AdminController: {
  adminDashboard: 'isAuthenticated',
},

ItemController: {
  findOne: 'isPublishedOrIsAuthenticated'
}

api/policies/isAuthenticated.jsapi/policies/isPublished.jsおよびAND / ORチェックの一部として使用するその他のポリシー:

(コールバックではなく) ブール値nextに設定されている場合、ポリシーが通常返す前にまたはを返します。truetruefalsenext()res.notFound()

module.exports = function(req, res, next) {
  // do some checking
  if(next === true) return true; // or return false
  return next();
};

ここでは、 3 つの等号を使用する必要があることに注意してください。

API/ポリシー/isPublishedOrIsAuthenticated.js

module.exports = function(req, res, next) {
  var isPublished = require('./isPublished.js');
  var isAuthenticated = require('./isAuthenticated.js');

  // This reads like what we are trying to achieve!
  // The third argument in each call tells the function to return a boolean
  if(isPublished(req, res, true) || isAuthenticated(req, res, true))
    return next();

  return res.notFound();
};
于 2015-03-30T18:10:49.783 に答える