Могу ли я выполнить пользовательские действия после успешного входа в Devise? - PullRequest
20 голосов
/ 21 января 2011

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

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

Ответы [ 4 ]

32 голосов
/ 07 декабря 2014

На самом деле, принятый ответ не работает должным образом в случае комбинированных модулей входа Omniauth и Database в Devise.

Собственный хук, который выполняется после каждого успешного входа в действие в Devise (без учета канала аутентификации пользователя), является warden.set_user (вызывается devise sign_in helper: http://www.rubydoc.info/github/plataformatec/devise/Devise/Controllers/SignInOut#sign_in-instance_method).

Чтобы выполнить пользовательское действие после успешного входа пользователя (в соответствии с документами Warden: https://github.com/hassox/warden/wiki/Callbacks), поместите это в инициализатор (например. after_sign_in.rb в config / initializers )

Warden::Manager.after_set_user except: :fetch do |user, auth, opts|
  #your custom code
end

Обновление 2015-04-30 : Благодаря предложению @seanlinsley (см. Комментарии ниже) я исправил ответ, включив в него кроме:: fetch , чтобы вызвать обратный вызов только когда пользователь аутентифицирован, а не каждый раз, когда он установлен.

Обновление 2018-12-27 Спасибо @thesecretmaster за то, что он указал, что Warden теперь имеет встроенные обратные вызовы для выполнения вашего собственного кода на after_authentication https://github.com/wardencommunity/warden/wiki/Callbacks#after_authentication

18 голосов
/ 24 января 2011

Редактировать : Учтите, что это когда-то было хорошим решением, но, возможно, есть и лучшие способы справиться с этим.Я оставляю это здесь только для того, чтобы дать людям другой выбор и сохранить историю, пожалуйста, не понижайте голос.

Да, вы можете сделать это.Первый ресурс, на который я посмотрю: 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.

6 голосов
/ 27 апреля 2017

Я использую рельсы 5 и устройство 4.2.1, мое решение - это функция overide devise для модели пользователя:

def after_database_authentication
    # here's the custom code
end

, и модель пользователя будет выглядеть следующим образом:

class User < ApplicationRecord
    devise :database_authenticatable, :registerable,
        :recoverable, :rememberable, :trackable, :validatable,
        :timeoutable, :lockable
    def after_database_authentication
        # here's the custom code
    end
end

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

4 голосов
/ 08 июня 2015

Я решил эту проблему, переопределив метод 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), тогда я выполняю свои настройки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...