2

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またはpermited_toを使用したドキュメントのAuthorizationInModelオブジェクトを使用してこれがサポートされているようです。ドキュメントに基づいてこれらの関数を使用する方法や、現在のモデルに対する現在のユーザーの特権のリストを返す方法を理解できませんでした。

何か案は?

4

2 に答える 2

1

組み込みの if-attribute メソッドを使用して別の解決策を見つけました。名前空間のないモデルと名前空間のコントローラーとビューを使用していたため、最初はそこから離れました。この構造は、私が取り組んでいるプロジェクトの元のバージョンの成果物です。私の仕事のほとんどは、この構造を扱うための宣言的な承認を得ています。

私にとって明確ではなかった主な情報は、部分的に名前空間が設定された環境でアクセス許可に名前を付ける方法でした。モデルはモデル名 (:people) を想定し、コントローラーは名前空間とモデル (:staff_people) を想定し、ビューはユーザーが選択する限り気にしませんでした。私が選んだ解決策は、モデル名を使用し、すべてのコントローラーでコンテキストを明示的に設定することでした。コントローラーでコンテキストが設定されていない場合、filter_access_to を使用しても機能しません。これは、適切なパーミッションである people ではなく、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

Namespaced コントローラーでこの情報にアクセスするには、filer_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 パーミッションを使用する必要があるメソッドでは機能しませんでした。なぜこれが問題だったのかわかりません

引数の一部として 1 つのレコードを取得する 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
于 2011-05-05T21:24:11.103 に答える
0

これを行うためのより良い方法があるかもしれませんが、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
于 2011-05-04T03:53:52.863 に答える