2010-10-08 5 views
13

Ich verwende Devise zur Authentifizierung in meiner Rails-App und möchte bestimmte Konten blockieren und verhindern, dass Benutzer sich mit einer gesperrten E-Mail erneut registrieren. Ich bin mir nur nicht sicher, was der beste Weg ist, um darüber zu gehen.Was ist der beste Weg, um Benutzer mit Devise for Rails zu sperren/blockieren?

Mein erster Gedanke war, die Sitzungen und Registrierungen Controller zu überschreiben, um das Modell für einen Benutzer mit einem blockierten Bit zu überprüfen, aber ich habe das Gefühl, dass es eine elegantere Möglichkeit geben könnte.

Antwort

11

Ich würde es tun, wie folgt:

def after_sign_in_path_for(resource) 
    if resource.is_a?(User) && resource.banned? 
    sign_out resource 
    banned_user_path 
    else 
    super 
    end 
end 
+2

Beachten Sie, dass dies eine Schwäche hat: Wenn ein Benutzer gesperrt wird, während er bereits angemeldet ist, wird das Verbot erst wirksam, wenn sie sich abmelden und erneut anmelden (was sehr lange dauern kann) der Benutzer sich zu dem Zeitpunkt abzumelden, zu dem Sie ihn verbieten, oder diese Logik in eine 'before_action' in Ihren Controllern verschieben, anstatt' after_sign_in_path_for' zu verwenden. – GMA

+1

Wenn Sie den Benutzer verbieten, fügen Sie einfach eine weitere Zeile hinzu, um ihn abzumelden. – enter08

0

Sie ein custom validation method im User-Modell erstellen können, die, auf erstellen, überprüft, ob die E-Mail auf der Sperrliste der E-Mails ist.

2

Ein eleganterer Ansatz besteht darin, die find_for_authentication-Methode des (Benutzer-) Controllers außer Kraft zu setzen und sie nur für nicht blockierte Benutzer festzulegen. Auf diese Weise versuchen Sie, sich als blockierter Benutzer anzumelden, als würden Sie versuchen, sich als Benutzer anzumelden, der nicht existiert. (Wenn Sie den Benutzer sagen, wollen sie blockiert sind, können Sie einen Flash-Alarm setzen auch hier Here's a good run-through

5

Eine bessere Lösung ist es, die active_for_authentication Methode auf dem devise Modell (Benutzer) außer Kraft zu setzen, wie so:..?.

def active_for_authentication? 
     super && !self.banned? 
    end 
20

Der beste Ansatz ist es in Devise Weise zu tun:. übernimmt

Darunter Sie database_authenticable Modul und Ihre Anwendung Benutzer Modellnamen Benutzer Entwickeln verwenden

1. Implementieren Sie eine account_active? Methode.

Fügen Sie die boolesche Spalte account_active in der Benutzertabelle hinzu oder definieren Sie die Methode account_active? im Benutzermodell (Sie können Ihren eigenen Methodennamen wählen). Zum Beispiel:

# app/models/user.rb 
    def account_active? 
     blocked_at.nil? 
    end 

2. Überschreiben Sie die active_for_authentication? Methode in Ihrem Modell (Benutzer).

# app/models/user.rb 
    def active_for_authentication? 
     super && account_active? 
    end 

3. Add-Methode, die Übersetzung für Flash-Mitteilung zurückgibt.

Wenn active_for_authentication? false zurückgibt, fragt Devise den Grund, warum Ihr Modell inaktiv ist, mit der Methode inactive_message.

# app/models/user.rb 
    def inactive_message 
     account_active? ? super : :locked 
    end 

Und das ist es. Sie müssen sich nicht um sign_out oder redirect_to Benutzer kümmern.

Außerdem wird Benutzer sofort gesperrt, mit dem nächsten Anforderung, nicht nach dem nächsten Zeichen in

Mehr:. devise/authenticatable.rb.

+0

Bitte sagen Sie, was jede Datei für jeden Codeblock ist? –

+1

@AymanSalah getan wie gewünscht. Alle drei Methoden müssen in 'app/models/user.rb' platziert werden (vorausgesetzt, dass user.rb Ihr Modell ist, das für die Benutzer der Anwendung verantwortlich ist) – sampi

+0

Vielen Dank mein Mann. Ihre Antwort war sehr hilfreich. –

Verwandte Themen