22

überschreiben Wie kann ich current_user von devise gem. Eigentlich muss ich Webdienste für Mobile-App hinzufügen.Wo current_user Hilfsmethode von Gerät

Gegenwärtig wird die Sitzung und 'current_user' für die Web-Anwendung verwaltet.

Jetzt Mobile App wird Benutzer-ID an den Server senden. Ich muss den aktuellen Benutzer wie folgt überschreiben

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

Sollte ich Devise Edelstein als Plugin ändern? oder etwas anderes ?
Bitte erklären Sie ausführlich, wie ich neu in Schienen bin.

Mit freundlichen Grüßen

+2

yikes ... also, sagen Sie, wenn ein mobiler Agent eine user_id sendet, werden Sie ihm vertrauen? –

+0

auch einige Authentifizierung geheimer Schlüssel –

+0

Devise wird das token_authenticatable behandeln - nur übergeben authentication_token up, keine Notwendigkeit für user_id. –

Antwort

46

Nach dem Modul Devise::Controllers::Helpers, current_user (zusammen mit allen anderen devise Helfer) an Application, hinzugefügt, was bedeutet, dass Sie es auf diese Weise außer Kraft setzen können:

# 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

Fehler in der Zeile "alias_method": undefined_method 'current_user' für die Klasse ApplicationController (NameError) beim Start meiner Umgebung. Wenn ich es auskommentiere, hochfahre und auskommentiere, funktioniert es gut. Hast du eine Lösung? – Frexuz

+5

Frexuz, versuchen Sie die alias_methode durch etwas wie ersetzen: def devise_current_user {@devise_current_user || = warden.authenticate (: scope =>: user)} –

+0

ist das thread-sicher? Ich bekomme keine Fehler in seltsamen Punkten in den Controllern nach der Authentifizierung im MRT. –

5

Die Eine andere Antwort, die Aliasing der Methode vorschlägt, ist eigentlich nicht die beste Lösung. Doug Englisch Kommentar ist die beste Lösung:

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

Hier ist der Grund:

Angenommen, sind Sie Ihre ApplicationHelper in Ihrem Controller inklusive. Wenn Sie eine Methode in Ihrem ApplicationHelper benötigen, die auf devise_current_user angewiesen ist, wenn Sie die Alias-Lösung im Controller verwenden, haben Sie kein Glück.

Aber mit der obigen expliziten Methodendefinition können Sie die Definition in den Helper verschieben und sie von anderen Methoden aufrufen, und Sie können sie trotzdem in den Controller aufnehmen.

Dies ist beispielsweise nützlich, wenn Sie eine Benutzeridentitätslösung entwickeln und zwei verschiedene Benutzer in der Ansicht angezeigt werden, eine für den echten Administrator (devise_current_user) und die andere den imitierten Benutzer (current_user). .

+2

Tatsächlich hast du recht. Bitte erwähnen Sie, dass im 'ApplicationController' folgendes enthalten sein sollte: 'include ApplicationHelper'. Andernfalls wird 'devise_current_user' unbekannt. –

0

Angenommen wir unsere Session-Daten vertrauen können (die auf beruht, ob Sie Benutzereingaben ohne entsprechende Genehmigung in dort setzen oder nicht), wird dies als ein Problem funktionieren könnte:

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 

Ich verwende diese in ein Projekt für jetzt.

Eine kleine Frage (in der Antwort, sorry) ... sollte ich irgendwelche Änderungen in Devise oder Warden beachten, die devise_current_user über veraltet machen?

0

Limbo-Peng Antwort ist groß, aber kann ein wenig um sicherzustellen, dass nur Administratoren verbessert werden kann, dies tun:

Sie müssen auch eine is_admin? Methode oder is_admin Attribut auf der Benutzerklasse definieren.

Sie können auch einen anderen Schlüssel als user_id verwenden, damit er niemals mit Ihren normalen Parametern in Konflikt gerät.

# 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 
Verwandte Themen