所以,我在这里尝试做的事情很简单:
在我的路线提供商中,我有类似
的内容$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,can can只访问routes / 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
这不是我所期待的,所以前三个日志都很好,第三个不等待承诺返回(所以我没有登录用户)然后是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);
}
};
我做错了什么?为什么在执行其他代码之前未解析check函数中的用户?
答案 0 :(得分:0)
您是否可以使用会话/本地存储或$ rootScope,您可以在用户登录时使用给定路径,权限信息存储用户授权对象。
现在是路由解析或run()块,您可以检索用户身份验证对象执行授权操作。
e.g。
.run(['sessionService', '$rootScope', '$location', function(sessionService, $rootScope, $location) {
$rootScope.$on( "$routeChangeStart", function(event, next, current) {
var currentUser = sessionService.get('user_details');
if(next.taskAccess && next.taskAccess != ""){
var hasPerm = $rootScope.getPermission(next.taskAccess);
if(!hasPerm){
$location.path('/unauthorized');
}
}
});
}]);