Подтвердить что ты не робот

Могу ли я выполнять пользовательские действия после успешного входа в систему с помощью Devise?

У меня есть приложение, которое имеет базовую аутентификацию. После входа в систему я хотел бы найти учетную запись пользователя (пользователь принадлежит учетной записи, учетной записи has_many users) и сохранить ее в сеансе, чтобы она была доступна, как @current_user.

Каков рельсовый способ хранения сеанса в образовании? Есть ли крючок, который я могу использовать с Devise для выполнения кода после успешной регистрации?

4b9b3361

Ответ 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

он был вызван сразу после аутентификации, я прочитал это из разработать документацию, надеюсь, что это могло бы помочь