質問

私は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
役に立ちましたか?

解決 2

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

  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

クライアントコードが正しいことを検証したら、別のdoを作成します。

他のヒント

私はネストするとは思わない if_attribute ステートメントは実際にそのように機能します。デフォルトの宣言_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

:join_by うまくいきますが、それに関する私の問題は、時々あなたが両方が必要だということです ANDOR. 。異なる引数として、単一の行で複数の条件を指定できます。これらは一緒に使用されます 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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top