我使用以下代码来处理基于身份验证的某些状态的访问。例如,如果用户已登录,则他们无法进入/登录或/注册。此外,如果他们没有登录,他们应该无法访问/管理员。我遇到的问题与上一个问题有关(参见:Waiting for $http before running angular spa)。在解决该问题后,在触发$ stateChangeStart事件之前不会发生解决。这会导致登录/ admin页面的用户刷新浏览器,即使他们已登录,也会碰到/登录页面。我希望有一种方法可以等待,或者也许我需要调整我对我的状态的决心。
处理run()中的状态更改:
$rootScope.$on("$stateChangeStart", function(event, toState, toParams, fromState, fromParams) {
if (toState.access && toState.access.noauth && AuthenticationService.isLogged()) {
event.preventDefault();
$state.transitionTo('app.admin.dashboard');
}
if (toState.access && toState.access.auth && !AuthenticationService.isLogged()) {
event.preventDefault();
$state.transitionTo('app.login');
}
});
解析身份验证验证:
$stateProvider
.state('app', {
abstract: true,
url: '/',
views: {
root: {
templateUrl: 'tpl/index.html'
}
},
resolve: {
User: ['$window', '$q', 'AuthenticationService', 'UserService' , function($window, $q, AuthenticationService, UserService) {
if ($window.sessionStorage.token && !AuthenticationService.isLogged()) {
var d = $q.defer();
UserService.verify().success(function (data) {
AuthenticationService.setLogged(true);
d.resolve();
}).error(function () {
delete $window.sessionStorage.token;
d.resolve();
});
return d.promise;
}
}]
}
});