22

どうすれば上書きできますか?current_userdevise gem。 実際にはモバイルアプリ用のWebサービスを追加する必要があります。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 

私はプラグインとしてdevise gemを変更する必要がありますか?または、他の何か ?
私はレールが新しくて、親切に説明してください。

敬具、モジュールDevise::Controllers::Helpersによる

+2

yikes ...だから、モバイルエージェントがuser_idを送信したときにあなたはそれを信頼するでしょうか? –

+0

また何らかの認証秘密鍵 –

+0

Deviseはそのtoken_authenticatableを処理します - 単にauthentication_tokenを渡すだけで、user_idは必要ありません。 –

答えて

46

current_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 
+8

"alias_method"行のエラー:私の環境を起動するとき、クラスApplicationController(NameError)のための未定義メソッド 'current_user'。私がコメントアウトして起動し、コメントを外すと、正常に動作します。修正がありますか? – Frexuz

+5

Frexuzのようにalias_methodを次のように置き換えてみてください。 def devise_current_user {@devise_current_user || = warden.authenticate(:scope =>:user)} –

+0

はこのスレッドセーフですか?私は、MRIでの認証後にコントローラの変わった点で無限のエラーが発生しています。 –

5

他の答えは、メソッドのエイリアシングが実際には最良の解決策ではないことを示唆しています。

は、あなたのコントローラであなたのApplicationHelperを含めていると仮定します。

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

ここに理由があります:ダグ・英語のコメントが最適なソリューションです。あなたのApplicationHelperの中でdevise_current_userに依存するメソッドが必要な場合、コントローラの中にエイリアスソリューションがあると、あなたは不運です。

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

これは、たとえば、ユーザーの偽装ソリューションを開発していて、実際の管理者(devise_current_user)と偽装ユーザー(current_user)の2人のユーザーを表示する必要がある場合などに便利です。 。私たちは(あなたが適切な権限またはないせずにそこにユーザーの入力を入れているかどうかに依存している)私たちのセッションデータを信頼できると仮定すると、

+2

本当にあなたは正しいです。 'ApplicationController'には次のものが含まれていなければなりません: 'include ApplicationHelper'。さもなければ、 'devise_current_user'は不明になります。 –

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の変更について認識していますか?

0

リンボ - 鵬の答えは素晴らしいですが、管理者のみが、これを行うことができますを確認するために少しを改善することができます。

あなたはまた、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 
関連する問題