Разработка: как выполнить перенаправление на предыдущую страницу после входа в систему, но только если предыдущая страница требует аутентификации? - PullRequest
0 голосов
/ 08 июля 2020

Используя гем Devise , как я могу перенаправить на предыдущую страницу после входа в систему, но только если предыдущая страница требует аутентификации (в противном случае перенаправление на определенную страницу c, которую я определяю)?

Требуемый сценарий ios:

  • Попытайтесь получить доступ /my-private-account> Devise обнаруживает, что требуется аутентификация, и перенаправляет на вход> Успешный вход> перенаправляет на /my-private-account
  • Посетите / (не требует аутентификации)> посетить /login> успешно войти в систему> перенаправить на указанную страницу c например. /dashboard
  • Посетите /about (не требует аутентификации)> посетите /login> Успешный вход> перенаправьте на /dashboard

Это почти охвачено Devise Wiki , но их ответ перенаправляется обратно для ВСЕХ страниц. Например. с / (не требует аутентификации)> посетить /login> Успешный вход> перенаправляет обратно на /

Моя аутентификация определяется в маршрутах:

# routes.rb
authenticate :user do
  resources :events
end
# application_controller.rb
class ApplicationController < ActionController::Base
  before_action :store_user_location!, if: :storable_location?

  private
    # Redirect back to current page after sign in
    # ref: https://github.com/heartcombo/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,-sign-up,-update
    def storable_location?
      request.get? && is_navigational_format? && !devise_controller? && !request.xhr? 
    end

    def store_user_location!
      # :user is the scope we are authenticating
      store_location_for(:user, request.fullpath)
    end

    def after_sign_in_path_for(resource)
      stored_location_for(resource) || dashboard_path
    end

end

Есть ли способ проверить, требует ли маршрут аутентификации? Тогда я мог бы переопределить after_sign_in_path_for, например,

def after_sign_in_path_for(resource)
  if stored_location_for(resource).requires_authentication? # something like this...?
    stored_location_for(resource)
  else
    events_path
  end
end

Или я решаю эту проблему в неправильном направлении, и есть ли лучший способ?

Наконец, есть ли что-то еще, что мне нужно известно, чтобы эта работа работала и для omniauth?

1 Ответ

0 голосов
/ 09 июля 2020

Я думаю, что вам действительно нужно переопределить метод storable_location?, чтобы вы не сохраняли местоположения, которые не хотите go обратно.

Например, в контроллере, который обрабатывает / или /about маршруты, вы можете переопределить этот метод storable_location?, чтобы всегда возвращать false, чтобы эти местоположения не сохранялись, тогда stored_location_for не будет установлен.

...