Angulare UI-Router Login-Authentifizierung
Ich bin neu in AngularJS, und ich bin ein wenig verwirrt, wie ich die verwenden kann, eckig-"ui-router" in das folgende Szenario:
Ich Baue eine web-Applikation besteht aus zwei Abschnitten. Der erste Abschnitt ist die homepage mit Ihrem login und signup Ansichten, und der zweite Abschnitt ist das dashboard (nach erfolgreichen login).
Erstellt habe ich eine index.html
für den home-Bereich mit seiner eckigen app und ui-router
config zu handhaben /login
und /signup
Ansichten,
und es gibt eine andere Datei dashboard.html
für die dashboard-Bereich mit seiner app und ui-router
config mit vielen sub-views.
Nun beendete ich die dashboard-Bereich und wissen nicht, wie zu kombinieren, die zwei Abschnitte mit Ihren unterschiedlichen Winkel-apps. Wie könnte ich sagen, die home-app umgeleitet, um die dashboard-app?
InformationsquelleAutor der Frage Ahmed Hashem | 2014-03-20
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich bin in den Prozess der Herstellung ein schöner demo-als auch die Reinigung einiger dieser Leistungen in ein verwendbares Modul, aber hier ist, was ich mir ausgedacht habe. Dies ist ein komplexer Prozess zu umgehen, einige Punkte zu beachten, so hängen dort. Sie müssen zu brechen diese nach unten in mehrere Stücke.
Werfen Sie einen Blick auf diese plunk.
Erste, Sie brauchen einen service zum speichern der Identität des Benutzers. Ich nenne diese
principal
. Es kann überprüft werden, ob der Benutzer angemeldet ist, und auf Wunsch können Sie die Lösung eines Objekts darstellt, der wesentliche Informationen über die Identität des Benutzers. Dies kann sein, was Sie brauchen, aber der essentials wäre ein display-Namen, einen Benutzernamen zu erstellen, eventuell eine E-Mail, und die Rollen eines Benutzers (wenn dies für Ihre app). Principal hat auch Methoden, um die Rolle überprüft.Zweite, benötigen Sie einen Dienst, prüft den Zustand der Benutzer gehen möchte, macht Sie sicher, dass Sie eingeloggt sind (falls notwendig; nicht notwendig für signin, Passwort-reset, etc.), und dann spielt eine Rolle prüfen (wenn die app braucht diese). Wenn Sie nicht authentifiziert sind, sendet Sie an die sign-in-Seite. Wenn Sie authentifiziert sind, aber nicht, eine Rolle zu überprüfen, senden Sie eine access-denied Seite. Ich nenne das service
authorization
.Alles was Sie jetzt tun müssen, ist Zuhören
ui-router
's$stateChangeStart
. Dies gibt Ihnen die Möglichkeit zu untersuchen, den ist-Zustand, den Zustand, den Sie gehen möchten, und legen Sie Ihre Berechtigung überprüfen. Wenn es fehlschlägt, können Sie die cancel route-übergang, oder wechseln Sie zu einer anderen route.Der knifflige Teil an der Verfolgung der Identität eines Benutzers ist suchen Sie, wenn Sie bereits authentifiziert ist (sagen wir, Sie besuchen die Seite nach einer vorherigen Sitzung gespeichert und ein auth-token in einem cookie, oder vielleicht hat Sie es schwer, aktualisiert eine Seite, oder ließ sich auf einen URL von einem link). Aufgrund der Art und Weise
ui-router
Werke, die Sie tun müssen, um Ihre Identität zu lösen, einmal, bevor Sie Ihren auth-Prüfungen. Sie können dies tun, mit derresolve
option in Ihrem Staat config. Ich habe einen übergeordneten Staat für die Website ist, dass alle Staaten Erben, die zwingt den AUFTRAGGEBER behoben werden, bevor etwas anderes passiert.Es gibt ein anderes problem hier...
resolve
wird nur einmal aufgerufen. Sobald Ihre Versprechen für die Identität lookup abgeschlossen, es wird nicht ausgeführt, die zu beheben Delegierten wieder. Also wir haben zu tun, Ihre auth-Kontrollen an zwei Orten: einmal gemäß Ihrer Identität Versprechen der Lösung inresolve
deckt das erste mal, lädt Ihre app, und einmal in$stateChangeStart
wenn die Auflösung schon getan hat, was deckt Sie jederzeit navigieren Staaten.OK, also was haben wir bisher getan?
Wohin gehen wir von hier? Gut, können Sie organisieren Ihre Staaten in Regionen, die eine Anmeldung erfordern. Sie können verlangen, authentifiziert/autorisiert Benutzer, indem
data
mitroles
auf diese Staaten (oder ein Elternteil von Ihnen, wenn Sie möchten, verwenden Sie Vererbung). Hier beschränken wir uns eine Ressource für die Admins:Nun können Sie Steuern, vom Staat-was können die Benutzer den Zugriff auf eine route. Sonstige Anliegen? Vielleicht unterschiedlich, nur ein Teil einer Ansicht basierend auf, ob oder nicht Sie sind angemeldet? Kein problem. Verwenden Sie die
principal.isAuthenticated()
oder sogarprincipal.isInRole()
mit einer der zahlreichen Möglichkeiten, die Sie können, bedingt anzeigen einer Vorlage oder einem element.Ersten, injizieren
principal
in einen controller oder was auch immer, und kleben Sie es um den Umfang, so können Sie es einfach in Ihre Ansicht:Ein-oder ausblenden eines Elements:
Etc., , und so weiter. Na ja, in deinem Beispiel-app, Sie wäre ein Staat für die home-Seite, die lassen den nicht authentifizierten Benutzer vorbei. Hätten Sie links auf sign in oder sign-up-Zustände, oder haben die Formen eingebaut in diese Seite. Was auch immer zu Ihnen passt.
Den dashboard-Seiten können alle Erben von einem Staat erfordert, dass der Benutzer angemeldet sein, und, sagen wir, ein
User
Rolle Mitglied. Alle die Autorisierung Sachen, die wir besprochen haben, würde das fließen von dort.InformationsquelleAutor der Antwort HackedByChinese
Die Lösungen gepostet so weit sind unnötig kompliziert, meiner Meinung nach. Es gibt einen einfacheren Weg. Die Dokumentation von
ui-router
sagt hören$locationChangeSuccess
und verwenden$urlRouter.sync()
zu überprüfen, ein Zustand, übergang, halt oder fortsetzen. Aber auch das funktioniert nicht.Allerdings sind hier zwei einfache alternativen. Pick:
Lösung 1: hören Sie auf
$locationChangeSuccess
Können Sie hören
$locationChangeSuccess
sind, so können Sie eine gewisse Logik, auch asynchrone Logik. Basierend auf dieser Logik, lassen Sie die Funktion undefined zurück, die bewirkt, dass der Staat den übergang zu ganz normal weiter, oder können Sie$state.go('logInPage')
wenn der Benutzer muss authentifiziert werden. Hier ist ein Beispiel:Beachten Sie, dass dies nicht wirklich verhindern, dass der soll-Zustand aus dem laden, aber es funktioniert redirect auf die Login-Seite, wenn der Benutzer nicht autorisiert ist. Das ist okay, da wirkliche Schutz ist auf dem server, trotzdem.
Lösung 2: die Verwendung von state
resolve
In dieser Lösung verwenden Sie
ui-router
- beheben-Funktion.Dass Sie im Grunde ablehnen, die Versprechen in
resolve
wenn der Benutzer nicht authentifiziert ist, und dann leiten Sie Sie auf der log-in-Seite.Hier ist, wie es geht:
Im Gegensatz zu der ersten Lösung, diese Lösung tatsächlich verhindert, dass der soll-Zustand aus dem laden.
InformationsquelleAutor der Antwort M.K. Safi
Die einfachste Lösung ist die Verwendung
$stateChangeStart
undevent.preventDefault()
zum Abbrechen der Zustand ändern, wenn der Benutzer nicht authentifiziert ist, und leiten ihn an die auth Staat, der die login-Seite.InformationsquelleAutor der Antwort sebest
Ich denke, Sie brauchen einen
service
die mit der Authentifizierungs-Prozess (und deren Speicherung).In diesem service müssen Sie einige grundlegende Methoden :
isAuthenticated()
login()
logout()
Dieser Dienst sollte injiziert werden in den Controllern der einzelnen module :
service.isAuthenticated()
- Methode) . wenn nicht, Umleitung auf /loginservice.login()
MethodeEinen guten und robusten Beispiel für dieses Verhalten ist das Projekt angular-app und insbesondere seine security-Moduldie über die genial HTTP-Auth-Interceptor-Modul
Hoffe, das hilft
InformationsquelleAutor der Antwort Cétia
Habe ich das Modul um diese Prozess Stück Kuchen
Können Sie Sachen wie tun:
Oder auch
Es ist ganz neu, aber lohnt sich!
https://github.com/Narzerus/angular-permission
InformationsquelleAutor der Antwort Rafael Vidaurre
Ich wollte eine andere Lösung, die das arbeiten mit dem ui-router 1.0.0.X
Wie Sie vielleicht wissen, stateChangeStart und stateChangeSuccess sind nun veraltet. https://github.com/angular-ui/ui-router/issues/2655
Stattdessen sollten Sie verwenden $übergänge http://angular-ui.github.io/ui-router/1.0.0-alpha.1/interfaces/transition.ihookregistry.html
Dies ist, wie ich es erreicht:
Ersten habe ich und AuthService mit einigen nützlichen Funktionen
Dann habe ich diese Konfiguration:
Können Sie sehen, dass ich
markieren der Staat nur zugänglich, wenn Sie authentifiziert ist.
dann auf die .führen Sie ich die übergänge zu überprüfen, die autheticated Zustand
Baue ich dieses Beispiel mit einigen code gefunden, auf der $ - übergänge-Dokumentation. Ich bin ziemlich neu mit dem ui-router, aber es funktioniert.
Hoffen, daß es hilft jemand.
InformationsquelleAutor der Antwort Sergio Fernandez
Hier ist, wie wir aus dem unendlichen routing-loop und noch verwendet werden
$state.go
statt$location.path
InformationsquelleAutor der Antwort Jason
Ich habe eine andere Lösung:, die Lösung funktioniert perfekt, wenn Sie nur Inhalte, die Sie wollen, um zu zeigen, wenn Sie angemeldet sind. Definieren Sie eine Regel, wo Sie geprüft, ob Sie angemeldet sind und nicht Weg von whitelist-Routen.
In meinem Beispiel Frage ich mich, ob ich mich nicht eingeloggt und die aktuelle route, die ich weiterleiten wollen, ist nicht Teil der `/login', weil meine whitelist-Routen sind die folgenden
also ich habe sofortigen Zugriff auf diese zwei Wege, und jeder andere Weg wird aktiviert, wenn Sie online sind.
Hier ist mein ganzes routing-Datei für das login-Modul
() => { /* code */}
ist ES6-syntax, verwenden Sie stattdessenfunction() { /* code */}
InformationsquelleAutor der Antwort Chris Incoqnito
Zuerst müssen Sie einen service, der Sie zu injizieren in Ihr Controller, der hat einige Idee, die app-Authentifizierung Zustand. Anhaltende auth-Daten mit local storage ist eine anständige Art und Weise zu nähern.
Als Nächstes müssen Sie überprüfen Sie den Zustand der auth rechts, bevor sich der Zustand ändert. Seit Ihrem app hat einige Seiten, die authentifiziert werden müssen und andere, die das nicht können, erstellen Sie eine übergeordnete route, die prüft, auth, und alle anderen Seiten, die verlangen, dass die gleichen sein, die ein Kind von diesem Elternteil.
Schließlich müssen Sie einige Weg, zu sagen, wenn der aktuell angemeldete Benutzer können bestimmte Operationen durchzuführen. Dies kann erreicht werden, indem eine 'kann' - Funktion, um Ihren auth-service. Können die zwei Parameter nimmt:
- action - required - (dh 'manage_dashboards' oder 'create_new_dashboard')
- Objekt - optional - Objekt betrieben wird, auf. Zum Beispiel, wenn Sie eine dashboard-Objekts, möchten Sie vielleicht überprüfen, um zu sehen, ob dashboard.ownerId === loggedInUser.id. (Natürlich, Informationen vom client übergeben sollte nie vertraut werden, und Sie sollten immer überprüfen Sie diese auf dem server vor dem schreiben in Ihrer Datenbank).
** DISCLAIMER: Der obige code ist pseudo-code und kommt mit keinerlei Garantien **
InformationsquelleAutor der Antwort colefner
$Http-Interceptor
Durch die Verwendung eines $http-interceptor-Sie können senden-Header an den Back-end oder die andere Weise herum und tun Sie Ihre Prüfungen so.
Großen Artikel auf $http Abfangjäger
Beispiel:
Setzen Sie diese in Ihr .config oder .run-Funktion.
InformationsquelleAutor der Antwort TSlegaitis