質問

私は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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top