user_signed_in rails español current_user ruby ruby-on-rails-3 devise

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.