30

どうすればデバイスgemのcurrent_userをオーバーライドできますか。 実際、モバイルアプリ用のWebサービスを追加する必要があります。

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

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

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

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

敬具、

4

4 に答える 4

58

モジュールDevise::Controllers :: Helpersによると、current_user(他のすべてのdeviseヘルパーと一緒に)ApplicationControllerに追加されます。これは、次の方法でオーバーライドできることを意味します。

# in application_controller.rb

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

def current_user
  if params[:user_id].blank?
    devise_current_user
  else
    User.find(params[:user_id])
  end   
end
于 2012-04-27T11:36:27.677 に答える
6

メソッドのエイリアシングを示唆するもう1つの答えは、実際には最善の解決策ではありません。ダグ・イングリッシュのコメントが最善の解決策です。

# 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)です。

于 2014-09-02T22:52:04.857 に答える
1

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

is_admin?Userクラスでメソッドまたは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
于 2017-02-19T19:07:42.187 に答える
0

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

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マイナーな質問(回答では、申し訳ありません)...上記を時代遅れにするDeviseまたはWardenの変更に注意する必要がありますか?

于 2015-10-28T08:52:13.073 に答える