Geçtiğimiz günlerde uygulamamda kimlik doğrulamayı uygularken $stateChangeStart
etkinliğiyle bir sorunla karşılaşıyorum. Böyle boole değeri ile bazı sayfalara erişimi kısıtlı:Köşeli yönlendirici Maksimum çağrı yığını boyutu aşıldı
.state('login', {
url:'/login',
templateUrl: 'modules/authentication/views/login.html',
controller: 'LoginController',
data: {
requireAuthentication: false
}
})
ve herhangi bir kimlik doğrulama verisi varsa, kontrol etmek ve kullanıcı requireAuthentication: true
bir rota erişirse o otomatik oturum açma sayfasına yönlendirilir. Yani, bu standart bir kimlik doğrulama davranışı.
Uygulama sırasında Maximum call stack size exceeded
hatayı aldım. Kodun 10 satırında neyin yanlış olduğunu bulmak için dört gece saat harcadım.
Muhtemelen çalışan bir çözümden sonra (benim gibi) ilgilenecek olanlar için çalışma çözümüm ile bir cevap yayınlayacağım. Bence bu diğer üyeler için önemli bir şey.
angular.module('YourModule', [...dependecies...])
.run(function($rootScope, $cookies, $state) {
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
var shouldLogin = toState.data.requireAuthentication !== undefined
&& toState.data.requireAuthentication;
// NOT authenticated - wants any private stuff
if(shouldLogin || fromState.name === "") {
var token = $cookies.get('JWT') == null ? null : $cookies.get('JWT');
if (token == null) {
if(toState.name === 'login')
return;
$state.go('login');
event.preventDefault();
} else {
if(toState.name === toState.name)
return;
//TODO: Check token
$state.go(toState.name);
event.preventDefault();
}
}
});
});
Yani, $cookies
benim kimlik doğrulama verisi alıyorum: