¿Puedo ejecutar acciones personalizadas después de iniciar sesión correctamente con Devise?

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 corresponde a cuenta, la cuenta tiene muchos usuarios) y guardarla en la sesión para que esté disponible como @current_user .

¿Cuál es la forma en que los Rails almacenan la sesión en una formación como esta? ¿Hay un gancho que pueda usar con Devise para ejecutar el código después de iniciar sesión correctamente?

Edición : Tenga en cuenta que esta vez fue una buena solución, pero probablemente haya mejores maneras de manejar esto. Solo lo dejo aquí para dar a las personas otra opción y preservar la historia, por favor, no voten.

Sí, usted puede hacer esto. El primer recurso que vería es http://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in . Además, consulte ¿Cómo redirigir a una página específica para registrarse correctamente usando los Rails gemela? para algunas ideas

Puedes hacer algo como:

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

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

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

El gancho nativo que se ejecuta después de cada inicio de sesión exitoso en Devise (sin tener en cuenta el canal de autenticación del usuario) es warden.set_user (llamado por devise sign_in helper: http://www.rubydoc.info/github/plataformatec/devise/Devise/ Controladores / SignInOut # sign_in-instance_method ).

Para ejecutar una acción personalizada después de que el usuario inicie sesión correctamente (de acuerdo con Warden Docs: https://github.com/hassox/warden/wiki/Callbacks ), ponga esto en el inicializador (por ejemplo, after_sign_in.rb en config / initializers )

 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 (vea los comentarios a continuación), corregí la respuesta para incluir excepto:: fetch para activar la callback solo cuando el usuario está autenticado y no cada vez que se configura.

Estoy usando los Rails 5 y el dispositivo 4.2.1, mi solución es una función de diseño general en 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 

Fue llamado justo después de la autenticación, lo leí de esta documentación del dispositivo , espero que esto pueda ayudar

Resolví este problema anulando el método de create del controlador de sesión como sigue

 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 a super ), entonces realizo mi configuración.