ruby - rails - sign_in_and_redirect




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

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

Собственный хук, который выполняется после каждого успешного входа в действие в Devise (без учета канала аутентификации пользователя), называется warden.set_user ( вызывается помощником devise sign_in : 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

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

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


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


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

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







devise