所以,我在这里要做的事情很简单:
-
检查每个路由上的loggedUser的角色(如果令牌或登录凭据在后端有效,则使用解析设置用户)
-
重定向到预期路线
-
如果不允许路由,则重定向到其他路由
在我的路线提供者中,我有类似的东西
$routeProvider
...
.when('/admin', {
templateUrl: 'views/admin/dashboard.html',
controller: 'AdminDashboardCtrl',
resolve: {
checkLoggedUser: check
}
})
...
ckeck就是这个功能
var check = function($rootScope, $q, AuthService) {
var deferred = $q.defer();
if($rootScope.loggedUser) {
return;
}
console.log('inside resolve check')
AuthService.check().success(function(data) {
$rootScope.loggedUser = data.user;
deferred.resolve(data.user);
});
console.log('finished check')
return deferred.promise;
};
而我的AuthService.check()就是这个功能
check: function()
{
var authtoken = StorageService.get('authtoken');
if(!authtoken) {
$location.path('login');
}
console.log('before returning');
return $http.post($rootScope.base + 'auth/authenticate', { 'authtoken': authtoken });
},
在我的.run(功能我有
$rootScope.$on('$routeChangeSuccess', function() {
setIntendedUrl();
console.log($rootScope.loggedUser);
console.log($location.path());
});
和setIntendedUrl()检查loggedUser并重定向到正确的页面(或者,在我想要完成的任务中,如果不允许,重定向到另一个页面,例如loggedUser有role = 1,只能访问路径/ admin,如果用户有role = 2,并且请求的路径是/ admin,则必须将其重定向到/ user)
所以在完成所有这些代码后,当应用程序运行时,这是我在控制台中的日志(请参阅代码,它们在哪里被调用)
inside resolve check app.js:29
before returning authservice.js:24
finished check app.js:36
intended: /admin/agents/create app.js:149 <--- here is where I redirect the user
Object {id: "21", name: "Kyle", surname: "Butler", roleId: "2"...} app.js:167
/admin/agents/create <--- requested path
这不是我所期望的,所以前三个日志都很好,第三个不等待承诺返回(所以我没有一个loggedUser)然后AuthService:check()返回用户,它就是一切此时完成,具有role = 2的用户处于不允许查看的路由中 .
只是为了完成代码,这是setIntendedUrl函数
var setIntendedUrl = function() {
intended = $location.path();
console.log('intended: ' + intended)
if(intended !== '/login') {
if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '1' && !/^\/admin*/.test(intended)) {
intended = '/admin';
} else if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '2' && !/^\/manager*/.test(intended)) {
intended = '/manager';
}
StorageService.set('intended', intended);
//$location.path(intended);
}
};
我做错了什么?为什么在执行其他代码之前,检查功能中的用户没有得到解决?
1 回答
您是否可以使用会话/本地存储或$ rootScope,您可以在用户登录时使用给定路径,权限信息存储用户授权对象 .
现在是route resolve或run()块你可以检索用户auth对象执行授权操作 .
例如
}]);