ruby - rails - devise user_signed_in
¿Puedo ejecutar acciones personalizadas después de iniciar sesión correctamente con Devise? (4)
Tengo una aplicación que tiene autenticación básica de 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 rieles almacenan la sesión en una formación como esta? ¿Hay un enlace que pueda usar con Devise para ejecutar el código después de iniciar sesión correctamente?
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 el asistente de inicio de sesión : http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/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 devolución de llamada solo cuando el usuario está autenticado y no cada vez que se configura.
Actualización 2018-12-27 Gracias a @thesecretmaster por señalar que Warden ahora tiene devoluciones de llamada incorporadas para ejecutar su propio código en after_authentication https://github.com/wardencommunity/warden/wiki/Callbacks#after_authentication
Estoy usando los rieles 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.
Edición : Tenga en cuenta que esta vez fue una buena solución, pero probablemente hay 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 a favor.
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 rieles 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.