Могу ли я выполнять пользовательские действия после успешного входа в систему с помощью Devise?
У меня есть приложение, которое имеет базовую аутентификацию. После входа в систему я хотел бы найти учетную запись пользователя (пользователь принадлежит учетной записи, учетной записи has_many users) и сохранить ее в сеансе, чтобы она была доступна, как @current_user
.
Каков рельсовый способ хранения сеанса в образовании?
Есть ли крючок, который я могу использовать с Devise для выполнения кода после успешной регистрации?
Ответы
Ответ 1
Изменить: Пожалуйста, подумайте, что это когда-то было хорошим решением, но, вероятно, есть более эффективные способы решения этой проблемы. Я оставляю его здесь, чтобы дать другим возможность и сохранить историю, пожалуйста, не уменьшайте.
Да, вы можете это сделать. Первый ресурс, на который я бы посмотрел, - http://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in. Кроме того, ознакомьтесь с Как перенаправить на определенную страницу на успешную запись с помощью rails devise gem? для некоторых идей.
Вы можете сделать что-то вроде:
def after_sign_in_path_for(resource_or_scope)
session[:my_account] = current_user.account
profile_url
end
Вы можете реализовать этот метод в своем ApplicationController или в пользовательском RegistrationsController.
Ответ 2
Собственно, принятый ответ не работает должным образом в случае комбинированных модулей входа в Omniauth и Database в Devise.
Собственный крюк, который выполняется после каждого успешного действия в Devise (без учета канала аутентификации пользователя), является warden.set_user (вызванный device sign_in helper: http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#sign_in-instance_method).
Чтобы выполнить пользовательское действие после успешного входа пользователя (согласно Warden Docs: https://github.com/hassox/warden/wiki/Callbacks), поместите это в инициализатор (например, after_sign_in.rb в Config/инициализаторы)
Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
#your custom code
end
Обновление 2015-04-30. Благодаря предложению @seanlinsley (см. комментарии ниже), я исправил ответ, включив кроме:: fetch, чтобы вызвать обратный вызов только тогда, когда пользователь аутентифицирован и не каждый раз, когда он установлен.
Ответ 3
Я решил эту проблему, переопределив метод create
контроллера сеанса, как показано ниже
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
Другими словами, если аутентификация прошла успешно (вызывая super
), я выполняю свои настройки.
Ответ 4
Я использую рельсы 5 и разрабатываю 4.2.1, мое решение переопределяет функцию на пользовательской модели:
def after_database_authentication
# here the custom code
end
и модель пользователя будет выглядеть так:
class User < ApplicationRecord
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable,
:timeoutable, :lockable
def after_database_authentication
# here the custom code
end
end
он был вызван сразу после аутентификации,
я прочитал это из разработать документацию, надеюсь, что это могло бы помочь