Devise Login mit Benutzer oder Admin-Modelle und Base-Camping Stil Subdomains
-
26-09-2019 - |
Frage
Ich habe separate Modelle für Devise Nutzer und Administratoren. Ich bin auch mit Base-Camping Stil Subdomains. Alles funktioniert gut, außer für einige Controller und Aktionen, wo ich entweder als Benutzer oder als Administrator authentifizieren zu können.
Zur Zeit habe ich authenticate_user! Satz in meinem application_controller.rb und ich bin es mit skip_before_filter für die Controller und Aktionen Skipping, dass nur Administratoren Zugriff haben sollte.
Leider kann ich nicht einfach die Authentifizierungsanforderung an jedem Controller angeben, da ich noch einige Controller und Aktion müssen Zugang zu sowohl von einem Benutzer oder einem Administrator.
Ich habe ein paar Dinge ohne Erfolg versucht. Es scheint, dass, wenn ich das authenticate_user bewegen! und authenticate_admin! in eine Art Sub-Domain-Erkennungslogik versagt es zu verarbeiten. Grundsätzlich gilt:
current_subdomain = request.subdomains.first
if current_subdomain == 'admin'
authenticate_admin!
else
authenticate_user!
end
Ich war an einem Punkt, in der Lage zu bekommen es die Authentifizierung zu versuchen, aber aus irgendeinem Grund es versagte die Sitzungssteuerung auszunehmen von Authentifizierung benötigen, die in einer Umleitungsschleife geführt (eine Premiere für mich Ruby!).
Ich weiß, dass ich ein Feld zu meinem Benutzer hinzufügen könnte, die Admin-Status bezeichnet, aber die Anwendung erfordert eine größere Trennung der Zuständigkeiten zwischen User und Admin als erlaubt, mit Ausnahme einiger Controller und Aktionen.
- Ruby-1.9.2
- Rails 3.0.3
- Devise 1.1.3
Lösung
Versuchen Sie, Ihre eigenen, bevor der Filter entlang der Linien des Schreibens
#application_controller.rb
def authenticate_any!
if admin_signed_in?
true
else
authenticate_user!
end
end
dann in der Steuerung, wo Sie beide Administratoren und Benutzer mögen in der Lage, den Zugang durch die Authentifizierung verwenden haben
#myobject_controller.rb
before_filter :authenticate_any!
Wenn Sie sich als Administrator angemeldet haben, dann werden Sie die before_filter passieren, sonst werden Sie durch authenticate_user gehen! Das ist das Standardverhalten.
Andere Tipps
Eigentlich dies nicht funktioniert:
#application_controller.rb
def authenticate_any!
if admin_signed_in?
true
else
authenticate_user!
end
end
Es wird eine unendliche Rekursion auf Authentifizieren Benutzer starten ..
Versuchen Sie stattdessen:
def authenticate_user!
return if admin_signed_in?
super
end
Bitte beachten Sie, dass mit dieser zweiten Lösung sind Sie so etwas wie dies zu sagen: ‚Sie müssen als angemeldet sein, zumindest, Benutzer‘ und Sie erhalten die Authentifizierung von Benutzern nur verlieren.
Admins den Zugriff auf alles können.
Vielleicht sollten Sie zusätzliches Juwel betrachten - CanCan zu Griff Rollen
Ganz schön hier beschrieben: