J'ai une application AngularJS créée en utilisant yeoman, grunt et bower.
J'ai une page de connexion qui a un contrôleur qui vérifie l'authentification. Si les informations d'identification sont correctes, je redirige vers la page d'accueil.
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";
}
}
});
Sur la page d'accueil, j'ai
<span class="user-info">
<small>Welcome,</small>
{{user.name}}
</span>
<span class="logout"><a href="" ng-click="logoutUser()">Logout</a></span>
Dans le loginController
, je vérifie les informations de connexion et si cela réussit, je définis l'objet utilisateur dans l'usine de service. Je ne sais pas si c'est exact ou non.
Ce dont j'ai besoin, c'est que lorsque l'utilisateur est connecté, il définit une valeur dans l'objet utilisateur afin que toutes les autres pages puissent obtenir cette valeur.
Chaque fois qu'un changement d'itinéraire se produit, le contrôleur doit vérifier si l'utilisateur est connecté ou non. Sinon, il devrait rediriger vers la page de connexion. De plus, si l'utilisateur est déjà connecté et revient à la page, il doit aller à la page d'accueil. Le contrôleur doit également vérifier les informations d'identification sur toutes les routes.
J'ai entendu parler des ng-cookies, mais je ne sais pas comment les utiliser.
La plupart des exemples que j'ai vus n'étaient pas très clairs et ils utilisent une sorte de rôles d'accès ou quelque chose. Je ne veux pas de ça. Je veux seulement un filtre de connexion. Quelqu'un peut-il me donner des idées?
routeChangeStart
rappel, vous devriez vérifier si l'emplacement est réellement "/ login" et autoriser que:if ( $location.path() === "/login" ) return;
Voici une autre solution possible, utilisant l'
resolve
attribut du$stateProvider
ou du$routeProvider
. Exemple avec$stateProvider
:Access
résout ou rejette une promesse en fonction des droits de l'utilisateur actuels:UserProfile
copie les propriétés de l' utilisateur en cours, et mettre en œuvre le$hasRole
,$hasAnyRole
,$isAnonymous
et la$isAuthenticated
logique des procédés (plus un$refresh
procédé, décrites plus loin):Auth
se charge de demander au serveur, de connaître le profil de l'utilisateur (lié à un jeton d'accès attaché à la requête par exemple):Le serveur doit renvoyer un tel objet JSON lors de la demande
GET api/auth
:Enfin, lorsque
Access
rejette une promesse, en cas d'utilisationui.router
, l'$stateChangeError
événement sera déclenché:Si vous utilisez
ngRoute
, l'$routeChangeError
événement sera déclenché:Le profil utilisateur est également accessible dans les contrôleurs:
UserProfile
contient alors les propriétés renvoyées par le serveur lors de la demandeGET api/auth
:UserProfile
doit être actualisé lorsqu'un utilisateur se connecte ou se déconnecte, afin deAccess
pouvoir gérer les itinéraires avec le nouveau profil utilisateur. Vous pouvez soit recharger la page entière, soit appelerUserProfile.$refresh()
. Exemple lors de la connexion:la source
La manière la plus simple de définir un comportement personnalisé pour des itinéraires individuels serait assez simple:
1)
routes.js
: créez une nouvelle propriété (commerequireAuth
) pour n'importe quel itinéraire souhaité2) Dans un contrôleur de niveau supérieur qui n'est pas lié à un élément à l'intérieur du
ng-view
(pour éviter tout conflit avec angular$routeProvider
), vérifiez si lenewUrl
possède larequireAuth
propriété et agissez en conséquencela source
routes.js
.J'ai écrit un article il y a quelques mois sur la façon de configurer l'enregistrement des utilisateurs et la fonctionnalité de connexion avec Angular, vous pouvez le consulter à http://jasonwatmore.com/post/2015/03/10/AngularJS-User-Registration-and -Login-Example.aspx
Je vérifie si l'utilisateur est connecté à l'
$locationChangeStart
événement, voici mon app.js principal montrant ceci:la source
J'ai l'impression que cette façon est la plus simple, mais c'est peut-être juste une préférence personnelle.
Lorsque vous spécifiez votre route de connexion (et toute autre route anonyme; ex: / register, / logout, / refreshToken, etc.), ajoutez:
Donc, quelque chose comme ça:
Vous n'avez jamais besoin de spécifier "allowAnonymous: false", s'il n'est pas présent, il est supposé faux, dans la vérification. Dans une application où la plupart des URL sont authentifiées de force, cela représente moins de travail. Et plus sûr; si vous oubliez de l'ajouter à une nouvelle URL, le pire qui puisse arriver est qu'une URL anonyme est protégée. Si vous le faites dans l'autre sens, en spécifiant "requireAuthentication: true", et que vous oubliez de l'ajouter à une URL, vous divulguez une page sensible au public.
Ensuite, exécutez-le là où vous vous sentez le mieux adapté à la conception de votre code.
la source
app.js
loginServices.js
sessionServices.js
loginCtrl.js
la source
Vous pouvez utiliser
resolve
:Et, la fonction de la résolution:
Firebase a également une méthode qui vous aide à installer un observateur, je vous conseille de l'installer dans un
.run
:la source
Par exemple, une application a deux utilisateurs appelés ap et auc. Je passe une propriété supplémentaire à chaque route et gère le routage en fonction des données que j'obtiens dans $ routeChangeStart.
Essaye ça:
app.js:
la source
Tous ont suggéré une grande solution pour laquelle vous vous inquiétez de la session côté client. Je veux dire quand l'état / l'url change, je suppose que vous faites un appel ajax pour charger les données pour tempelate.
Maintenant, les données ajax sont renvoyées par le serveur en utilisant n'importe quelle API. Maintenant, le point est entré en jeu, renvoyez les types de retour standard en utilisant le serveur en fonction du statut connecté de l'utilisateur. Vérifiez ces codes de retour et traitez votre demande dans le contrôleur. Remarque: - Pour le contrôleur qui ne nécessite pas d'appel ajax nativement, vous pouvez appeler une requête vide au serveur comme ceci
server.location/api/checkSession.php
et ceci est checkSession.phpDu côté client à l'intérieur du contrôleur ou via n'importe quel service comme indiqué dans d'autres réponses
Remarque: - Je mettrai à jour plus demain ou à l'avenir
la source
Vous devez vérifier l'authentification des utilisateurs sur deux sites principaux.
'$routeChangeStart'
rappella source