2017-09-20 2 views
0

Ich habe meine eigene Authentifizierungsfunktion für meine Controller eingerichtet, die mehr als nur überprüft, ob der Benutzer angemeldet ist (wenn es sich um einen Manager usw. handelt). Das Problem, das ich gefunden habe, ist, wenn die Person nicht angemeldet ist und versucht, auf eine Seite zuzugreifen, die Authentifizierung erfordert, werden sie erfolgreich auf die Anmeldeseite umgeleitet, aber nach der Anmeldung werden sie nicht zurück auf die Seite gesendet, die sie waren Zugriff versuchen.Rails 4: Devise redirect nach dem Anmelden

Ich habe folgendes ApplicationController hinzugefügt:

before_filter :store_location 

def store_location 
    p "storing location" 
    # store last url - this is needed for post-login redirect to whatever the user last visited. 
    return unless request.get? 
    if (request.path != "https://stackoverflow.com/users/sign_in" && 
     request.path != "https://stackoverflow.com/users/sign_up" && 
     request.path != "https://stackoverflow.com/users/password/new" && 
     request.path != "https://stackoverflow.com/users/password/edit" && 
     request.path != "https://stackoverflow.com/users/confirmation" && 
     request.path != "https://stackoverflow.com/users/sign_out" && 
     !request.xhr?) # don't store ajax calls 
    session[:previous_url] = request.fullpath 
    end 
end 

def after_sign_in_path_for(resource) 
    session["user_return_to"] || root_path 
end 

def new_authorize_employee 
    if current_user.nil? 
     redirect_to new_user_session_path, notice: "You must be signed in to access this page." 
    else 
     unless current_user.is_employee? 
      redirect_to root_path, notice: "You do not have permissions to access this page." 
     end 
    end 
end 

und in der Steuerung der Benutzer zuzugreifen versucht:

class EmployeesController < ApplicationController 
    before_action :new_authorize_employee 
    ... 
end 

aber der Benutzer immer noch auf die root_url nach Vorzeichen umgeleitet wird in Wie ändere ich die Authentifizierungsmethode, um Weiterleitungen auf die letzte Seite zu ermöglichen, auf die der Benutzer zugreifen wollte?

+1

Ist 'session [: previous_url]' und 'Session [ "user_return_to"]' sollte gleich sein? –

+0

Ich glaube so nach ihrem Wiki: https://github.com/plataformatec/devise/wiki/How-To:-Redirect-back-to-current-page-after-sign-in,-sign-out,- Anmeldung, -update. Ich habe auch beide versucht –

Antwort

0

Devise hat eine built in mechanism zum Speichern der Position.

class ApplicationController < ActionController::Base 
    before_action :store_location!, 
    unless: -> { devise_controller? || request.xhr? }, 
    if: -> { request.get? && is_navigational_format? } 

    before_action :authenticate_user!, 
    unless: :devise_controller? # prevents a circular redirect 


    private 

    def store_location! 
    # from Devise::Controllers::StoreLocation 
    # :user is the scope 
    store_location_for(:user, request.fullpath) 
    end 
end 

Der :store_location! Rückruf muss gestellt werden, bevor :authenticate_user! als :authenticate_user! wird die Filterkette stoppen umzuleiten, bevor der Ort gespeichert werden kann.

Mit den Optionen if: und unless: können Sie Bedingungen für einen Controller-Rückruf festlegen. Beachten Sie, dass dies nicht mit den Ruby-Schlüsselwörtern if und unless übereinstimmt.

devise_controller? und is_navigational_format? sind Devise-Helfer. devise_controller? sollte verwendet werden, um einen Rückruf in Device-bezogenen Controllern zu überspringen, anstatt bestimmte Pfade zu blockieren. Die standardmäßigen navigierbaren Formate sind ['*/*', :html].

Es besteht keine Notwendigkeit after_sign_in_path_for außer Kraft zu setzen, wie es bereits die gespeicherte Position verwendet:

def after_sign_in_path_for(resource_or_scope) 
    stored_location_for(resource_or_scope) || signed_in_root_path(resource_or_scope) 
end 
+0

Das Wiki für das ist wirklich veraltet, ich denke, dass ich es eines Tages aktualisieren sollte, aber das Leben immer in die Quere kommt. Fühlen Sie sich frei, dies dem Wiki hinzuzufügen, wenn Sie möchten. – max

Verwandte Themen