2011-01-20 9 views
16

Tengo una aplicación que tiene autenticación básica Devise. Después de iniciar sesión, me gustaría buscar la cuenta de usuario (el usuario pertenece_ a la cuenta, la cuenta tiene_muchos usuarios) y almacenarla en la sesión para que esté disponible como @current_user.¿Puedo ejecutar acciones personalizadas después de iniciar sesión correctamente con Devise?

¿Cuál es la manera en que los rieles almacenan sesiones en formación como esta? ¿Existe un gancho que pueda usar con Devise para ejecutar código después de iniciar sesión correctamente?

Respuesta

16

Editar: tenga en cuenta que esta vez fue una buena solución, pero es probable que haya mejores formas de manejar esto. Solo lo dejo aquí para brindarle a la gente otra opción y para preservar la historia, por favor no disminuya la votación.

Sí, puedes hacer esto. El primer recurso que miraría es http://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in. Además, echa un vistazo a How to redirect to a specific page on successful sign up using rails devise gem? para algunas ideas.

Usted puede hacer algo como:

def after_sign_in_path_for(resource_or_scope) 
    session[:my_account] = current_user.account 
    profile_url 
end 

Puede aplicar este método en su ApplicationController o en un RegistrationsController personalizado.

+11

parece bastante hacky –

+2

[este] (http://rubydoc.info/github/plataformatec/devise/master/Devise/Models/DatabaseAuthenticatable#after_database_authentication-instance_method) parece una forma menos hacky. – Anjan

+0

Esto fue respondido en 2011 y fue la solución aceptada en ese momento. Gracias por la actualización de otro método. –

28

En realidad, la respuesta aceptada no funciona correctamente en el caso de módulos combinados de inicio de sesión de Omniauth y de base de datos en Devise.

El gancho nativo que se ejecuta después de cada signo exitoso en acción en Diseñar (sin tener en cuenta el canal de autenticación de usuario) es warden.set_user (llamado por legado sign_in ayudante: http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#sign_in-instance_method).

Para ejecutar acción personalizada después de señal de usuario exitosa en (de acuerdo con Warden Docs: https://github.com/hassox/warden/wiki/Callbacks), poner esto en inicializador (. Ej after_sign_in.rb en config/inicializadores)

Warden::Manager.after_set_user except: :fetch do |user, auth, opts| 
    #your custom code 
end 

Actualización 2015-04-30: Gracias a la sugerencia de @seanlinsley (ver comentarios a continuación), he corregido la respuesta para incluir excepto:: obtener para activar la devolución de llamada solo cuando el usuario está autenticado y no cada vez que se autentica conjunto.

+1

Desearía poder hacer más de +1 esto <3 – seanlinsley

+0

@seanlinsley Me alegro de que haya sido útil :) – MatFiz

+1

Resulta que se llama a 'after_set_user' cada vez que se establece el usuario, no siempre que el usuario esté autenticado, lo que sucede al menos una vez por solicitud. Parece que 'after_authentication' sería la devolución de llamada más apropiada. – seanlinsley

2

que resuelven este problema reemplazando el método del controlador de la sesión create como seguir

class Admin::SessionsController < Devise::SessionsController 

    def create 
    super 
    # here goes my code 
    # my settings, etc 
    # do something with current_admin.fullname, for example 
    end 
end 

En otras palabras, si la autenticación es exitosa (llamando super) y luego realizo mis ajustes.

2

estoy usando rieles 5 y diseño 4.2.1, mi solución es la función legado overide el modelo de usuario:

def after_database_authentication 
    # here's the custom code 
end 

y el modelo de usuario se verá así:

class User < ApplicationRecord 
    devise :database_authenticatable, :registerable, 
     :recoverable, :rememberable, :trackable, :validatable, 
     :timeoutable, :lockable 
    def after_database_authentication 
     # here's the custom code 
    end 
end 

se le llamó justo después de la autenticación, lo leí de este devise documentation , espero que esto podría ayudar a

+0

Y para cerrar sesión ¿hay alguno? –

+0

@ SebastianVîrlan lo uso en el modelo de usuario Warden :: Manager.before_logout do | user, auth, opts | Tu código termina –

+0

En el modelo, ¿creo un método? ¿Puedes mostrarme un ejemplo? –

Cuestiones relacionadas