Przeczytałem wiele różnych przykładów implementacji uwierzytelniania w aplikacji Angular. ja używam Firebase Proste logowanie jako (Nie-) Backend.
Użytkownicy powinni widzieć tylko zawartość mojej aplikacji po zalogowaniu. Jeśli są wylogowani, widzą tylko /auth/login
i /auth/register
. Obecnie mam następujące rozwiązanie, które działa. Ale:
1) Nie jestem pewien, czy jest to kuloodporne, ponieważ ...
2) ... kiedy otwieram /home
ręcznie, gdy NIE jestem zalogowany, jestem poprawnie przekierowywany na /auth/login
ale HomeCtrl
i tak zostaje stracony. Żadne poufne dane nie są ujawniane, ponieważ żadne dane nie są zwracane z zaplecza, ale musi istnieć sposób, aby w ogóle NIE wykonać kontrolera, jeśli jestem wylogowany?
3) Czy za każdym razem, gdy ujawniam poufne dane, muszę sprawdzać w kontrolerze, czy użytkownik jest wielokrotnie uwierzytelniany?
Pytanie dodatkowe: Jak przekierować do /home
po pomyślnym zalogowaniu? Obecnie robię to w ramach mojej usługi AuthService $location.path("home");
po pomyślnym zalogowaniu, ale to nie uwzględnia stanu ?!
Moja aplikacja.js:
angular.module("myApp", ["ionic", "firebase", "myApp.services", "myApp.controllers"])
.run(function($rootScope, $location, AuthService) {
$rootScope.$on("$stateChangeStart", function (ev, to, toParams, from, fromParams) {
/**
* AuthService.isLoggedIn() returns TRUE or FALSE
* depending on whether user authenticated successfully
* against the Firebase backend
*/
// redirect to login
if (!AuthService.isLoggedIn() && to.name !== "auth.register") {
$location.path("/auth/login");
}
});
})
.config(function($stateProvider, $urlRouterProvider) {
$stateProvider
.state("auth", {
url: "/auth",
abstract: true,
templateUrl: "templates/auth-tabs.html",
controller: "AuthCtrl"
})
.state("auth.login", {
url: "/login",
views: {
"login-tab": {
templateUrl: "templates/auth-login.html"
}
}
})
.state("auth.register", {
url: "/register",
views: {
"register-tab": {
templateUrl: "templates/auth-register.html"
}
}
})
.state("home", {
url: "/home",
templateUrl: "templates/home.html",
controller: "HomeCtrl"
});
$urlRouterProvider.otherwise("/home");
});
Odpowiedzi:
1 dla odpowiedzi № 1Zaimplementowałem to poprzez obsługę pliku 401
Odpowiedź serwera http, ponieważ nie chcę się martwić sprawdzaniem stanu uwierzytelnienia użytkownika, wolę pozwolić serwerowi to obsłużyć.
Dokumentacja na $urlRouter.sync()
określa, że jeśli zapobiegniesz domyślnemu zdarzeniu, możesz ręcznie wyzwolić succesChange
angular.module("app", ["ui.router"]);
.run(function($rootScope, $urlRouter) {
$rootScope.$on("$locationChangeSuccess", function(evt) {
// Halt state change from even starting
evt.preventDefault();
// Perform custom logic
var meetsRequirement = ...
// Continue with the update and state transition if logic allows
if (meetsRequirement) $urlRouter.sync();
});
});