Modelの結果を制限するために宣言_Authorizationを使用します
-
28-10-2019 - |
質問
私はRailsプロジェクトの許可に宣言的認可GEMを使用しており、ユーザー許可に基づいてモデルからの出力を制限しようとしています。
私の略語された承認ファイルは次のようになります:
roles do
role :supervisor
has_permission_on :people, :to => :manage_all
end
role :basic_user
has_permission_on :people, :to => :manage_subordinates
end
end
privileges do
privilege :manage_subordinates do
includes :subordinate_records
end
privilege :manage_all do
includes :all_records
end
end
私の人々のモデルには、このようになりたい静的な方法があります
def self.supervised_by(user)
if user.permitted_to? :all_records
#return all of the records
elsif user.permitted_to? :subordinate_records
#return some of the records
else
#return none of the records
end
end
with_permissions_toまたはpermitted_toを使用して、ドキュメントでAuthorizationInModelオブジェクトを使用してこれをサポートしているようです。ドキュメントに基づいてこれらの関数を使用する方法や、現在のモデルの現在のユーザーの特権のリストを返す方法を理解することはできませんでした。
何か案は?
解決
組み込みのIFアトリブ法を使用した代替ソリューションを見つけました。私は元々、名前が非販売されていないモデルと名前付きコントローラーとビューを使用していたので、私は元々それから離れました。この構造は、私が取り組んでいるプロジェクトのオリジナルバージョンを形成するアーティファクトです。私の仕事のほとんどは、この構造に対処するために宣言的な許可を得ています。
私にとって明確ではなかった主要な情報は、部分的に名前のある環境で権限を名前を付ける方法でした。モデルはモデル名(:人)を期待し、コントローラーは名前空間とモデル(:staff_people)を期待し、ビューはそれを選ぶ限り気にしませんでした。私が選んだ解決策は、モデル名を使用して、すべてのコントローラーでコンテキストを明示的に設定することでした。コンテキストがコントローラーに設定されていない場合、filter_access_toを使用すると、正しい許可ではなくStaff_peopleの許可を探しているため、動作しません。
宣言認証設定ファイルでは、管理者に管理と部分的な権限に完全な権限を与えています。 person.supervisedは、それ自体と他のすべての監督された人々の配列を返します。
roles do
role :administrator
has_permission_on :people, :to => [:create, :read, :update, :delete]
end
role :supervisor
has_permission_on :people do
to => [:create, :read, :update, :delete]
if_attribute :id => is_in { Person.find_by_user_id(user.id).supervised }
end
end
end
この情報に名前を付けられたコントローラーでアクセスするには、fileter_resource_accessを使用しています。
module Staff
class PeopleController < ApplicationController
filter_resource_access :context => :people
def index
@people = People.with_permissions_to(:read)
end
使用していることがわかりました
filter_access_to :all, :with_attribute => true
with_permissions_toとif_attributeの許可を使用する必要がある方法では機能しませんでした。なぜこれが問題だったのかわかりません
引数の一部として単一のレコードを取得するIDを含めない非標準コントローラーアクションには、filter_access_toを使用する必要があります。たとえば、PART_TIMERSと呼ばれるアクションが人々のリストを返す場合、このソリューションは機能するはずのようです。
filter_resource_access :context => :people, :additional_member => { :part_timers => :read }
正しい解決策は、filter_resource_accessをそのままに保ち、そのアクションにfilter_access_toを追加することです
filter_resource_access :context => :people
fitler_access_to :part_timers, :required => :read, :context => people
他のヒント
これを行うためのより良い方法があるかもしれませんが、これはあなたのために機能するはずです supervised_by
メソッド他のすべてが正しく設定されている場合。
def self.supervised_by(user)
if Person.new.permitted_to? :all_records, :user=>user
#return all of the records
elsif Person.new.permitted_to? :subordinate_records, :user=>user
#return some of the records
else
#return none of the records
end
end