Verwenden eines Anmeldeformulars mit zwei Devise-Benutzermodellen und verschiedenen Authentifizierungsmethoden

8

Ich erstelle eine Site, die die Authentifizierung sowohl über LDAP als auch mit "lokalen" Benutzern, die nur auf der Site verwaltet werden, unterstützen muss.

Zur Zeit habe ich die folgenden Devise-Modelle:

%Vor%

Devise erzeugt Routen, die für jede von diesen getrennt sind, d. h. /local_users/sign_in und /ldap_users/sign_in . Dies ist nicht ideal, Benutzer sollten nicht wissen müssen, um welche Art von Benutzer es sich handelt, also möchte ich alles in einem Formular mit einem Satz von Anmelde- / Abmelde-URLs vereinheitlichen.

Ich habe mir einige Lösungen dafür angesehen, aber sie scheinen sich auf die Tatsache zu verlassen, dass die Modelle die gleiche Devise-Konfiguration oder die gleiche Authentifizierungsmethode haben.

Das einzige andere Beispiel dieser Art von Problemen, das ich gefunden habe, ist dieser Google Groups-Thread: Ссылка - was nicht beantwortet wurde.

    
danpalmer 15.01.2014, 23:21
quelle

1 Antwort

5

Das hat mich eine Weile gebraucht, bis ich es herausgefunden habe, aber ich habe schließlich eine funktionierende Lösung.

Ich möchte Jordan MacDonald, der die Frage gestellt hat, die ich oben in der Devise Google Group gestellt habe, den größten Dank aussprechen. Während dieser Thread keine Antwort darauf hatte, fand ich das Projekt, an dem er gearbeitet hatte, las den Code und passte ihn an meine Bedürfnisse an. Das Projekt ist Triage und ich empfehle dringend, die Implementierungen von SessionController und die Routen .

Ich empfehle auch Jordans Blogpost auf Devise: Ссылка

Modell

Wie oben ist mein Modell wie folgt, und ich verwende den Edelstein devise_ldap_authenticatable . In diesem Beispiel habe ich zwei Benutzer, LdapUser und LocalUser , aber ich sehe keinen Grund, warum dies nicht für zwei Devise-Benutzermodelle funktionieren würde, solange Sie eine Möglichkeit haben, zwischen ihnen zu unterscheiden.

> %Vor%

Controller

Der erste Teil, den wir brauchen, ist der Controller. Er sollte von Devise::SessionsController erben und wählt den Typ des Benutzers aus, den wir authentifizieren, und gibt diesen explizit an die Authentifizierungsstufe weiter, die von Warden bearbeitet wird.

Da ich für einen Teil der Authentifizierung LDAP für eine Active Directory-Domäne verwendete, konnte ich leicht erkennen, welche Details für LDAP authentifiziert werden sollten und welche nicht, aber dies ist implementierungsspezifisch.

%Vor%

Routen

Devise richtet viele Routen für jeden Benutzertyp ein, und das möchten wir größtenteils tun, aber da wir SessionsController überschreiben, müssen wir diesen Teil überspringen.

Nachdem es seine Routen eingerichtet hat, möchten wir dann eigene Handler für sign_in und sign_out hinzufügen. Beachten Sie, dass der Bereich "develope", der local_user ist, keine Rolle spielt. Er benötigt lediglich einen Standardbereich, wir überschreiben dies jedoch im Controller. Beachten Sie auch, dass dies local_user singular ist, das hat mich erwischt und viele Probleme verursacht.

%Vor%

Anzeigen

Die Ansicht ist sehr einfach und kann geändert werden, ohne zu viele Probleme zu verursachen.

%Vor%

Ich hoffe, das hilft jemand anderem. Dies ist die zweite Web-App, an der ich gearbeitet habe, die sowohl LDAP als auch lokale Authentifizierung hatte (die erste ist eine C # MVC4-Anwendung), und beide Male hatte ich erhebliche Probleme, Authentifizierungs-Frameworks zu bekommen, um das gut zu handhaben >     

danpalmer 17.01.2014, 00:10
quelle

Tags und Links