1

私には4つの異なるレベルのアクセスがあります。管理者、パートナー、従業員、クライアント。管理者、パートナー、および従業員は、クライアントに対する管理アクセス権を持っています。基本的に私が行ったことは、クライアントがベンダー(パートナー)にドキュメントをアップロードできるRailsアプリを作成することです。クライアントレベルのアクセスを除いて、すべてがうまく機能します。私には2つのコードがあります。パートコードとクライアントコード。パートナーは、ファイルのpartercodeフィールドがパートナーのパートナーコードと等しいファイルのみを表示できます。これは問題なく機能します。ただし、クライアントは、パートナーコードが一致し、クライアントコードが一致するファイルのみを表示できます。以下は私のクライアントセクションです。動作しているのは、クライアントがパートナーコードファイルのみを表示できるようになっていることですが、パートナーに属する他のクライアントを表示するように設定されています。(URLに番号を入力して)。これが問題になるとは思えませんが、

  role :client do
    has_permission_on [:users], :to => [:client, :edit, :update] do
      if_attribute :username => is { user.username }
    end
     has_permission_on [:documents], :to => [:client, :new, :create]
     has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
       if_attribute :partnercode => is { user.partnercode }, :clientcode => is { user.clientcode }
     end
  end
4

3 に答える 3

3

if_attributeステートメントのネストが実際にそのように機能するとは思いません。デフォルトでは、Declarative_authorization はこれらのif_attributeステートメントをステートメントと結合しますorが、私が正しく理解している場合は、それらを で結合する必要がありますand。これを変更するには、:join_by属性をに設定します:and

role :client do
  has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
    if_attribute :partnercode => is { user.partnercode }
    if_attribute :clientcode => is { user.clientcode }
  end
end

ソース: http://www.tzi.org/~sbartsch/declarative_authorization/master/classes/Authorization/Reader/AuthorizationRulesReader.html#M000184

于 2012-06-01T19:13:30.833 に答える
0

:join_byAND動作しますが、私の問題は、との両方が必要になる場合があることですOR。複数の if 条件を 1 行に異なる引数として指定できます。これらは を使用して一緒に比較されますANDが、各行は で評価されORます。

role :client do
  has_permission_on [:documents], :to => [:do_whatever], :join_by => :and do
    if_attribute :partnercode => is { user.partnercode }, 
                 :clientcode => is { user.clientcode } # These two are evaluated with AND
    if_attribute :some_attr => is { some_val }
  end
end
于 2012-12-17T11:19:41.853 に答える
0

私は答えを見つけました。皮肉なことに、答えはこの質問のタグにありました。ネストされています。

  role :client do
    has_permission_on [:users], :to => [:client, :edit, :update] do
      if_attribute :username => is { user.username }
    end
     has_permission_on [:documents], :to => [:client, :new, :create]
     has_permission_on [:documents], :to => [:client, :index, :show, :edit, :update, :destroy, :documents] do
       if_attribute :clientcode => is { user.clientcode } do
        if_attribute :partnercode => is { user.partnercode }
       end
     end
  end

clientcode が正しいことを確認したら、パートナー コードを確認するために別の do .. end を作成します。

于 2011-04-28T13:09:07.723 に答える