2014-05-09 15 views
22

Ich benutze Devise mit Ruby on Rails.Redirect zur Anmeldeseite, wenn Benutzer nicht mit Devise

Welche Methode wird empfohlen, um nicht authentifizierte Benutzer auf die neue Seite der Sitzungen umzuleiten, wenn sie versuchen, auf eine Seite zuzugreifen, die eine Authentifizierung erfordert?

Jetzt bekomme ich einen Fehler, der besagt, dass keine Route mit der Route übereinstimmt, auf die sie zugreifen wollen (was zu einem 404-Fehler in der Produktion führt).

Antwort

59

Gerade einfaches Add diese Methode zu application_controller.rb

protected 
    def authenticate_user! 
    if user_signed_in? 
     super 
    else 
     redirect_to login_path, :notice => 'if you want to add a notice' 
     ## if you want render 404 page 
     ## render :file => File.join(Rails.root, 'public/404'), :formats => [:html], :status => 404, :layout => false 
    end 
    end 

Und Sie können diese Methode auf before_filter einen anderen Controller rufen Sie wollen.

zB:

class HomesController < ApplicationController 
    before_filter :authenticate_user! 
    ## if you want spesific action for require authentication 
    ## before_filter :authenticate_user!, :only => [:action1, :action2] 
end 

vergiss nicht login_path in routes.rb

devise_scope :user do 
    match '/sign-in' => "devise/sessions#new", :as => :login 
end 

Notiz hinzufügen: Ich habe immer diese Art und Weise verwenden, wenn das Spiel mit devise für meine apps Authentifizierung .. (Schienen 3.2 und Schienen 4.0.1)

+0

Danke, das hat funktioniert. Ich erkannte auch, dass ich meine Routen falsch eingerichtet hatte - ich habe viele von ihnen in einen "authenticated: user" -Block gesetzt, weshalb ich 404 versuchte, auf sie zuzugreifen, wenn ich ausgeloggt bin. – Gdeglin

+0

Danke. Das hat gut für mich funktioniert, hat aber auch andere Probleme verursacht.Wenn ich zum Beispiel eine Benutzerregistrierung bearbeite, bekomme ich einen Argumentfehler (sage falsche Anzahl von Argumenten: 1 für 0) und deute auf "def authenticate_user!" - Zeile. Gesendete Frage hier: [link] (http://stackoverflow.com/questions/25170716/devise-ror-argument-error-when-editing-user-registration). Schätze die Hilfe! – orky

+0

Danke ** GeekToL ** –

1

Sie sollten auf Devise's eigene Anleitung verweisen: How To: Redirect to a specific page when the user can not be authenticated.

Eine andere Alternative, die ich mir vorstellen kann, ist das Erstellen einer Routing-Beschränkung, die Ihre geschützten Routen einhüllt. Sie würden bleiben besser zu ersinnen Weg, aber hier ist ein Beispiel:

#On your routes.rb 
constraints(Constraints::LoginRequired) do 
    get '/example' 
end 

#Somewhere like lib/constraints/login_required.rb 
module Constraints 
    class LoginRequired 
    def self.matches?(request) 
     #some devise code that checks if the user is logged in 
    end 
    end 
end 
+0

Danke für die Antwort. Wenn es um das Devise How To geht, zu dem Sie eine Verbindung hergestellt haben, enthält es nur Anweisungen für Rails 3, von denen einige nicht für Rails 4 gelten. Selbst wenn Sie versuchen, die Unterschiede zu berücksichtigen, funktioniert es nicht für mich. Versuche deinen Constraint-Vorschlag als nächstes. – Gdeglin

+0

Vielen Dank für die Verknüpfung der Devise-Dokumentation. Das sollte der richtige Weg sein. – maxhm10

-6

diesen Code hinzufügen in Ihrer config/routes.rb devise_for :users und resources :users und Sie können in Ansichten erzeugen entwickeln.

3

Ich dachte, Sie könnten einfach hinzufügen: before_action: authenticate_user! zu jedem Controller, der den Benutzer angemeldet sein musste.

Ich bin ein Rails Anfänger, aber ich fand dies in meinen eigenen Suchen und es funktioniert gut in meiner Anwendung.

14

Sie können nur das tun, wie GeekTol schrieb, oder setzen Sie einfach

before_action :authenticate_user! 

in Ihrem Controller.

In diesem Fall verwendet devise den Standard authenticate_user! Methode, die auf den "user_session_path" umleiten und die Standard-Flash-Nachricht verwenden.

Es ist nicht notwendig, authenticate_user umzuschreiben! Methode, es sei denn, Sie möchten es anpassen.

+0

Korrekte Antwort, wenn Sie das Gerät verwenden. Keine Notwendigkeit, neu zu schreiben, es sei denn, Sie möchten anpassen. – ben