3

すでに存在するかなり大きなアプリに認証を追加しようとしていますが、詳細を少しわかりにくくする必要があります。

背景は次のとおりです。

私たちのアプリには、大まかに次のように階層的な数または役割があります。

BasicUser -> SuperUser -> Admin -> SuperAdmin

承認のために、各ユーザーモデルインスタンスには、上記に対応する属性「ロール」があります。

Backofficeの下に名前空間が設定されたRESTfulコントローラー「Users」があります。つまり、Backoffice::UsersControllerです。

class Backoffice::UsersController < ApplicationController
  filter_access_to :all
  #... RESTful actions + some others
end

だからここに問題があります:

ユーザーがユーザーを編集するためのアクセス許可をユーザーに付与できるようにする必要がありますが、ユーザーが現在よりも「小さい」役割を持っている場合に限ります。私はauthorization_rules.rbで以下を作成しました

authorization do
  role :basic_user do
    has_permission_on :backoffice_users, :to => :index
  end
  role :super_user do
    includes :basic_user
    has_permission_on :backoffice_users, :to => :edit do
      if_attribute :role => is_in { %w(basic_user) }
    end
  end
  role :admin do
    includes :super_user
  end
  role :super_admin do
    includes :admin
  end
end

そして残念ながら、それは私が得た限りでは、ルールは適用されていないようです。

  1. ルールをコメントアウトすると、誰も編集できなくなります
  2. ルールを残しておけばみんな編集できます

if_attributeのバリエーションもいくつか試しました。

if_attribute :role => is { 'basic_user' }
if_attribute :role => 'basic_user'

そしてそれらは同じ効果を得る。誰か提案はありますか?

4

2 に答える 2

4

これでこの問題は解決したと思いますが、同様の問題が発生し、役立つ可能性のある解決策にたどり着きました。宣言型承認 DSL だけでケースを処理することはできないかもしれませんが、DSL を活用して、モデルとビューで正しいことを行うことができます。基本的に、ロール階層グラフへのアクセスが必要でした。

手がかりは、 declarative_authorization には、ロールの階層を示すグラフを生成する気の利いたコントローラーがあることです。同じサポート コードを使用して、任意のロールの祖先に簡単にアクセスできます。

class Role < ActiveRecord::Base
  require 'declarative_authorization/development_support/analyzer'

  has_many :assignments
  has_many :users, :through => :assignments

  validates :name, :presence => true
  validates :name, :uniqueness => true

  def ancestors
    Authorization::DevelopmentSupport::AnalyzerEngine::Role.for_sym(self.name.to_sym, 
      Authorization::Engine.instance).ancestors.map { |r| r.instance_variable_get("@role") }
  end

  def self_and_ancestors
    ancestors << self.name.to_sym
  end
end

次に、これを使用して、現在のユーザーの役割と同じかそれ以下の役割の選択をユーザー エディターでのみ提供したり、ユーザーを不適切に昇格させようとする人物に対してアクセスを拒否したり、モデルの変更を許可したりしないようにすることができます。最初に解析して一種の循環参照を作成する必要があるため、宣言型承認 DSL 自体のコンテキストではあまり役に立ちません。

これが必要な人に役立つことを願っています。

于 2011-03-03T09:20:23.823 に答える
0

私のアプリには次のアプローチがあり、機能します

role :super_user do
    includes :basic_user
    has_permission_on :backoffice_users do
      to :edit
      if_attribute :role => is {"basic_user"}
    end
end
于 2010-05-18T16:16:18.953 に答える