22

¿Cómo puedo anular usuario_actual de diseñar gema. En realidad, necesito agregar servicios web para aplicaciones móviles.Dónde reemplazar el método de ayuda del usuario actual de idear gema

Actualmente se está diseñando la sesión y 'current_user' para la aplicación web.

Ahora la aplicación móvil enviará user_id al servidor. Necesito anular al usuario actual como este

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

¿Debo modificar el ingenio de la gema como complemento? o algo mas ?
Explique detalladamente que soy nuevo en los rieles.

Saludos cordiales,

+2

yikes ... así que, ¿estás diciendo que cuando un agente móvil envía un user_id simplemente confías en él? –

+0

también alguna clave secreta de autenticación –

+0

Devise manejará ese token_authenticatable - acaba de pasar authentication_token up, sin necesidad de user_id. –

Respuesta

46

De acuerdo con el módulo Devise::Controllers::Helpers, current_user (junto con todos los otros ayudantes Idear) se añade a ApplicationController, lo que significa que se puede reemplazar de esta manera:

# 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

Error en la fila "alias_method": undefined_method 'current_user' para la clase ApplicationController (NameError), al iniciar mi entorno. Si lo comente, arranque y descomente, funciona bien. ¿Tienes una solución? – Frexuz

+5

Frexuz, intente reemplazar el alias_method con algo como: def devise_current_user {@devise_current_user || = warden.authenticate (: scope =>: user)} –

+0

¿es seguro para este subproceso? Recibo errores nulos en puntos extraños en los controladores después de la autenticación en MRI. –

5

El otra respuesta que sugiere aliasing el método en realidad no es la mejor solución. El comentario de Doug Inglés es la mejor solución:

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

Aquí está la razón:

Supongamos que estás incluyendo su ApplicationHelper en su controlador. Si necesita un método en su ApplicationHelper que se base en devise_current_user, dada la solución de alias dentro del controlador, no tiene suerte.

Pero con la definición de método explícito anterior, puede mover la definición a la ayuda y llamarla desde otros métodos y todavía puede incluirla en el controlador.

Esto es útil, por ejemplo, cuando está desarrollando una solución de suplantación de usuario y necesita mostrar dos usuarios diferentes en la vista, uno para el administrador real (devise_current_user) y el otro, el usuario suplantado (usuario_actual) .

+2

De hecho, tienes razón. Por favor, mencione que se debe incluir lo siguiente en 'ApplicationController': 'include ApplicationHelper'. De lo contrario, 'devise_current_user' se vuelve desconocido. –

0

Suponiendo que podemos confiar en nuestros datos de sesión (que depende de si usted pone la entrada del usuario en ese país sin autorización o no adecuada), esto podría funcionar como una preocupación:

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 

estoy usando esto en una proyecto por ahora.

Una pregunta menor (en la respuesta, lo siento) ... ¿debería saber si hay algún cambio en Devise o Warden que haga que devise_current_user esté desactualizado?

0

respuesta de Limbo-Peng es grande, pero se puede mejorar un poco para asegurarse de que sólo los administradores pueden hacer esto:

Tendrá que definir también un método is_admin? o is_admin atributo de la clase de usuario.

Es posible que también desee utilizar una clave diferente a user_id, por lo que nunca entrará en conflicto con sus parámetros habituales.

# 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 
Cuestiones relacionadas