web-dev-qa-db-ja.com

devise gemのcurrent_userヘルパーメソッドをオーバーライドする場所

どのようにオーバーライドできますか 現在の使用者 の 宝石を工夫する。 実際、モバイルアプリ用のウェブサービスを追加する必要があります。

現在deviseはセッションとWebアプリケーションの 'current_user'を管理しています。

これで、モバイルアプリはuser_idをサーバーに送信します。このように現在のユーザーを上書きする必要があります

def current_user
  if params[:user_id].blank?
    current_user
  else
    User.find(params[:user_id])
  end   
end

Devge gemをプラグインとして変更する必要がありますか?または、他の何か ?
Railsを初めて使用するので、親切に詳しく説明してください。

敬具、

28
Omer Aslam

モジュールによると Devise :: Controllers :: Helperscurrent_user(他のすべてのデバイスヘルパーとともに)がApplicationControllerに追加されます。つまり、次のようにオーバーライドできます。

# in application_controller.rb
alias_method :devise_current_user, :current_user
def current_user
  if params[:user_id].blank?
    devise_current_user
  else
    User.find(params[:user_id])
  end   
end
51
Limbo Peng

メソッドのエイリアスを提案する他の答えは、実際には最善の解決策ではありません。 Doug Englishのコメントが最善の解決策です。

# In ApplicationHelper
def devise_current_user
   @devise_current_user ||= warden.authenticate(:scope => :user)
end

その理由は次のとおりです。

コントローラーにApplicationHelperを含めているとします。コントローラー内のエイリアスソリューションを考えると、devise_current_userに依存するApplicationHelperのメソッドが必要な場合は、運が悪いです。

しかし、上記の明示的なメソッド定義を使用すると、定義をヘルパーに移動して他のメソッドから呼び出すことができ、それでもコントローラーに含めることができます。

これは、たとえば、ユーザーの偽装ソリューションを開発していて、ビューに2人の異なるユーザーを表示する必要がある場合に便利です。1つは実際の管理者(devise_current_user)で、もう1つは偽装ユーザー(current_user)です。

5
Amin Ariana

セッションデータを信頼できると仮定すると(適切な承認なしにユーザー入力をそこに入れるかどうかに依存します)、これは懸念事項として機能する可能性があります。

module Concerns
  module ControllerWithImpersonation
    extend ActiveSupport::Concern

    included do
      helper_method :devise_current_user
    end

    def current_user
      if session[:impersonated_user_id].blank?
        devise_current_user
      else
        User.find(session[:impersonated_user_id])
      end
    end

    def devise_current_user
      @devise_current_user ||= warden.authenticate(:scope => :user)
    end

  end
end

今のところ、これをプロジェクトで使用しています。

マイナーな質問(答えは申し訳ありませんが)... devise_current_user上記は古くなっていますか?

0
haslo

Limbo-Pengの答えは素晴らしいですが、管理者だけがこれを実行できるように少し改善することができます:

また、Userクラスでis_admin?メソッドまたはis_admin属性を定義する必要があります。

user_idとは異なるキーを使用することもできます。これにより、通常のパラメータと競合することはありません。

# to impersonate another user, e.g. for customer support
# only admins can do this..
#
alias_method :devise_current_user, :current_user
def current_user
  if ! params[:user_id].blank? \
     && devise_current_user && devise_current_user.is_admin? 
    User.find(params[:user_id])
  else
    devise_current_user
  end
end
0
Tilo