Oi pessoal, como provavelmente vocês encontraram algum tipo de problema em relação à autenticação AngularJS, como: “Como posso saber se o usuário está autenticado?” ou “Posso fazer com que uma página não abra se o usuário não tiver acesso a ela?”, bem, eu pensei que seria bom compartilhar minha descoberta com você.
Para fazer um usuário ser lembrado por nosso sistema, usamos um serviço que chamamos de SessionService e se parece com isto:
Serviço de Sessão
angular.module('MyApp.Services').service('SessionService', function(){
var userIsAuthenticated = false;
this.setUserAuthenticated = function(value){
userIsAuthenticated = value;
};
this.getUserAuthenticated = function(){
return userIsAuthenticated;
});
});
Isso nos permitirá verificar se o usuário atual já está logado ou não (lembre-se de que ainda será necessário armazenar esses valores em um cookie ou algo semelhante para evitar que o recarregamento da página redefina os valores).
O próximo requisito é um objeto onde possamos definir quais são as rotas e quais são públicas e quais não são:
Objeto de rotas
window.routes =
{
"/welcome": {
templateUrl: 'partials/welcome.html',
controller: 'WelcomeCtrl',
requireLogin: false
},
"/user-details": {
templateUrl: 'partials/userDetails.html',
controller: 'UserDetailsCtrl',
requireLogin: true
}
};
Observe que este objeto é muito semelhante ao objeto de rotas que normalmente usamos na “configuração” do nosso aplicativo, mas este tem “requireLogin” (e pode ter muito mais, use sua imaginação!).
Agora, a outra coisa que precisamos é um App, no qual usar o objeto de serviço e rotas anterior, algo assim:
Meu aplicativo
angular.module('MyApp', [
'MyApp.Services'
]);
MyApp.config(['$routeProvider', function($routeProvider){
//this loads up our routes dynamically from the previous object
for(var path in window.routes) {
$routeProvider.when(path, window.routes[path]);
}
$routeProvider.otherwise({redirectTo: '/welcome'});
}]).run(function(){
$rootScope.$on("$locationChangeStart", function(event, next, current) {
for(var i in window.routes) {
if(next.indexOf(i) != -1) {
if(window.routes[i].requireLogin && !SessionService.getUserAuthenticated()) {
alert("You need to be authenticated to see this page!");
event.preventDefault();
}
}
}
});
});
O $ locationChangeStart , ao contrário de $ routeChangeStart, permite que você cancele a navegação antes que ela aconteça usando event.preventDefault ();
Resumo (TLDR):
Com apenas três etapas fomos capazes de criar rotas autenticadas em nosso sistema, verifique o código acima: P