Ich habe eine AngularJS-Anwendung, die mit yeoman, grunt und bower erstellt wurde.
Ich habe eine Anmeldeseite mit einem Controller, der die Authentifizierung überprüft. Wenn die Anmeldeinformationen korrekt sind, leite ich zur Startseite um.
app.js.
'use strict';
//Define Routing for app
angular.module('myApp', []).config(['$routeProvider', '$locationProvider',
function($routeProvider,$locationProvider) {
$routeProvider
.when('/login', {
templateUrl: 'login.html',
controller: 'LoginController'
})
.when('/register', {
templateUrl: 'register.html',
controller: 'RegisterController'
})
.when('/forgotPassword', {
templateUrl: 'forgotpassword.html',
controller: 'forgotController'
})
.when('/home', {
templateUrl: 'views/home.html',
controller: 'homeController'
})
.otherwise({
redirectTo: '/login'
});
// $locationProvider.html5Mode(true); //Remove the '#' from URL.
}]);
angular.module('myApp').factory("page", function($rootScope){
var page={};
var user={};
page.setPage=function(title,bodyClass){
$rootScope.pageTitle = title;
$rootScope.bodylayout=bodyClass;
};
page.setUser=function(user){
$rootScope.user=user;
}
return page;
});
LoginControler.js
'use strict';
angular.module('myApp').controller('LoginController', function($scope, $location, $window,page) {
page.setPage("Login","login-layout");
$scope.user = {};
$scope.loginUser=function()
{
var username=$scope.user.name;
var password=$scope.user.password;
if(username=="admin" && password=="admin123")
{
page.setUser($scope.user);
$location.path( "/home" );
}
else
{
$scope.message="Error";
$scope.messagecolor="alert alert-danger";
}
}
});
Auf der Homepage habe ich
<span class="user-info">
<small>Welcome,</small>
{{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>
In der loginController
überprüfe ich die Anmeldeinformationen und wenn es erfolgreich ist, setze ich das Benutzerobjekt in der Service Factory. Ich weiß nicht, ob das richtig ist oder nicht.
Was ich brauche ist, wenn der Benutzer angemeldet ist, setzt es einen Wert im Benutzerobjekt, damit alle anderen Seiten diesen Wert erhalten können.
Bei Routenänderungen sollte der Controller prüfen, ob der Benutzer angemeldet ist oder nicht. Wenn nicht, sollte es zur Anmeldeseite umleiten. Wenn der Benutzer bereits angemeldet ist und zur Seite zurückkehrt, sollte er zur Startseite wechseln. Der Controller sollte auch die Anmeldeinformationen auf allen Routen überprüfen.
Ich habe von ng-Cookies gehört, weiß aber nicht, wie ich sie verwenden soll.
Viele der Beispiele, die ich gesehen habe, waren nicht sehr klar und sie verwenden irgendeine Art von Zugriffsrollen oder so. Das will ich nicht Ich möchte nur einen Anmeldefilter. Kann mir jemand ein paar Ideen geben?
routeChangeStart
Rückruf sollten Sie überprüfen, ob der Speicherort tatsächlich "/ login" ist, undif ( $location.path() === "/login" ) return;
Hier ist eine andere mögliche Lösung, die das
resolve
Attribut des$stateProvider
oder des verwendet$routeProvider
. Beispiel mit$stateProvider
:Access
löst ein Versprechen in Abhängigkeit von den aktuellen Benutzerrechten auf oder lehnt es ab:UserProfile
Die aktuellen Benutzereigenschaften Kopien und implementieren die$hasRole
,$hasAnyRole
,$isAnonymous
und$isAuthenticated
Methoden Logik (plus ein$refresh
Verfahren, später erläutert):Auth
ist dafür verantwortlich, den Server anzufordern, um das Benutzerprofil zu kennen (das beispielsweise mit einem an die Anforderung angehängten Zugriffstoken verknüpft ist):Es wird erwartet, dass der Server ein solches JSON-Objekt zurückgibt, wenn er Folgendes anfordert
GET api/auth
:Wenn
Access
ein Versprechen abgelehnt wirdui.router
, wird das$stateChangeError
Ereignis ausgelöst , wenn es verwendet wird:Bei Verwendung
ngRoute
wird das$routeChangeError
Ereignis ausgelöst:Auf das Benutzerprofil kann auch in den Controllern zugegriffen werden:
UserProfile
Enthält dann die vom Server zurückgegebenen Eigenschaften, wenn Folgendes angefordert wirdGET api/auth
:UserProfile
muss aktualisiert werden, wenn sich ein Benutzer anmeldet oder abmeldet, damitAccess
die Routen mit dem neuen Benutzerprofil verarbeitet werden können. Sie können entweder die gesamte Seite neu laden oder anrufenUserProfile.$refresh()
. Beispiel bei der Anmeldung:quelle
Die einfachste Art, benutzerdefiniertes Verhalten für einzelne Routen zu definieren, wäre ziemlich einfach:
1)
routes.js
: Erstellen Sie eine neue Eigenschaft (wierequireAuth
) für jede gewünschte Route2) Überprüfen Sie in einem Controller der obersten Ebene, der nicht an ein Element innerhalb des Controllers gebunden ist
ng-view
(um Konflikte mit dem Winkel zu vermeiden$routeProvider
), ob dernewUrl
über dierequireAuth
Eigenschaft verfügt, und handeln Sie entsprechendquelle
routes.js
.Ich habe vor einigen Monaten einen Beitrag zum Einrichten der Benutzerregistrierungs- und Anmeldefunktion mit Angular geschrieben. Sie können ihn unter http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and nachlesen -Login-Example.aspx
Ich überprüfe, ob der Benutzer bei dem
$locationChangeStart
Ereignis angemeldet ist. Hier ist meine Haupt-App.js, die dies zeigt:quelle
Ich denke, dieser Weg ist am einfachsten, aber vielleicht ist es nur eine persönliche Präferenz.
Wenn Sie Ihre Anmelderoute (und alle anderen anonymen Routen, z. B. / register, / logout, / refreshToken usw.) angeben, fügen Sie Folgendes hinzu:
Also so etwas:
Sie müssen niemals "allowAnonymous: false" angeben, wenn es nicht vorhanden ist, wird es bei der Prüfung als false angenommen. In einer App, in der die meisten URLs zwangsweise authentifiziert werden, ist dies weniger Arbeit. Und sicherer; Wenn Sie vergessen, es einer neuen URL hinzuzufügen, ist das Schlimmste, was passieren kann, dass eine anonyme URL geschützt ist. Wenn Sie es andersherum tun und "requireAuthentication: true" angeben und vergessen, es einer URL hinzuzufügen, wird eine vertrauliche Seite an die Öffentlichkeit weitergegeben.
Führen Sie dies dann aus, wo immer Sie der Meinung sind, dass es am besten zu Ihrem Code-Design passt.
quelle
app.js.
loginServices.js
sessionServices.js
loginCtrl.js
quelle
Sie können verwenden
resolve
:Und die Funktion der Entschlossenheit:
Firebase hat auch eine Methode, mit der Sie einen Beobachter installieren können. Ich empfehle, sie in einem zu installieren
.run
:quelle
Zum Beispiel hat eine Anwendung zwei Benutzer namens ap und auc. Ich übergebe jeder Route eine zusätzliche Eigenschaft und verarbeite das Routing basierend auf den Daten, die ich in $ routeChangeStart erhalte.
Versuche dies:
app.js:
quelle
Alle haben eine große Lösung vorgeschlagen, warum Sie sich Sorgen um die Sitzung auf der Clientseite machen. Ich meine, wenn sich Status / URL ändert, führen Sie vermutlich einen Ajax-Aufruf aus, um die Daten für Tempelate zu laden.
Jetzt werden die Ajax-Daten vom Server mit einer beliebigen API zurückgegeben. Jetzt kam der Punkt ins Spiel, Standardrückgabetypen über den Server entsprechend dem Anmeldestatus des Benutzers zurückzugeben. Überprüfen Sie diese Rückkehrcodes und bearbeiten Sie Ihre Anfrage im Controller. Hinweis: - Für Controller, die nativ keinen Ajax-Aufruf benötigen, können Sie eine leere Anforderung an den Server wie diesen aufrufen.
server.location/api/checkSession.php
Dies ist checkSession.phpAuf der Clientseite innerhalb des Controllers oder über einen beliebigen Dienst, wie in anderen Antworten gezeigt
Hinweis: - Ich werde morgen oder in Zukunft weitere Updates durchführen
quelle
Sie sollten die Benutzerauthentifizierung an zwei Hauptstandorten überprüfen.
'$routeChangeStart'
Rückrufsquelle