decrarative_authorizationのユーザーへの複数の条件if_attribute
-
25-10-2019 - |
質問
私は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
:join_by
うまくいきますが、それに関する私の問題は、時々あなたが両方が必要だということです AND
と OR
. 。異なる引数として、単一の行で複数の条件を指定できます。これらは一緒に使用されます 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