3

認証に関しては、CanCan の機能をもう少しよく理解しようとしています。次のコントローラー アクションを想像してください。

def update
  if can? :action, Model or can? :resolve, Model or can? :authorize, AnotherModel
    # My Code here
    respond_with @model
  else
    raise CanCan::AccessDenied.new(nil, :update, Model)
  end
end

を使用して上記の解決策を見つけようとしているときに、この時点に到達しましたauthorize!。私が見る限り(署名も見てauthorize!)、次のようなオプションのメッセージとともに、1つの許可(アクション)と1つの件名のみを受け入れます。

def authorize!(action, subject, *args)
  # code
end

複数のアクションをチェックするように許可するように指示するために見落としている可能性のある方法はありますか? 2 つの authorize を次々に配置すると、パーミッション間の条件として機能します。基本的に上記のカスタム コードと同様にAND、条件のように機能することを望みます ( CanCan での発生の問題があり、回避可能ではありません)。私が本当にやりたいこと)。ORAuthorizationNotPerformedskip_authorize_resource

4

2 に答える 2

3

最後に、このかなり優れたソリューションを能力クラスに追加しました。

def multi_authorize!(*actions, message_hash)
    message = nil
    if message_hash.kind_of?(Hash) && message_hash.has_key?(:message)
      message = message_hash[:message]
    end
    auth = false
    actions.each do |act|
      auth = auth || can?(act[0], act[1])
    end
    if !auth
      message ||= unauthorized_message(actions[0][0], actions[0][1])
      raise CanCan::AccessDenied.new(message, actions[0][0], actions[0][1])
    end
end

コントローラーのヘルパーが含まれています:

module CanCanAddition
  def multi_authorize!(*args)
    @_authorized = true
    current_ability.multi_authorize!(*args)
  end
end

if defined? ActionController::Base
  ActionController::Base.class_eval do
    include ApplicationHelper::CanCanAddition
  end
end

私はこれをこのように呼んでいます:

  def create
    multi_authorize! [:create, Model1], [:authorize, Model2], :message => "You are not authorized to perform this action!"
    # other code...
  end

警告:能力クラスのコードのため、メッセージを提供する必要があります。そうしないと、最後の認証ペアがに渡されません*args。私はこれを克服するために少し時間がかかりますが、私が思う解決策のアイデアはうまく合います。

于 2012-11-23T11:49:52.510 に答える
3

カスタム アクションを作成し、条件をいくつでも作成できorます。

can :my_update_action, Project do |project|
  can?(:read, ModelX) || can?(:read, ModelY) || ... 
end
于 2012-11-22T16:53:29.080 に答える