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
War es hilfreich?

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:

scroll top