我正在尝试检查AngularJS应用程序中路由的权限。路由由角用户界面路由器处理.
我的路由和每个路由的权限定义如下:
angular.module('my_app')
.config(function ($stateProvider, $urlRouterProvider) {
$stateProvider
.state('root', {
abstract: true,
templateUrl: 'content.html',
resolve: {
user_info: function (UserService) {
return UserService.user_info();
}
}
})
.state('root.some_page', {
url: '/',
templateUrl: 'some_page.html',
controller: 'home',
data: {
roles: ['some_right', 'some_other_right]
}
});
}
然后检查权限,如下所示:
[...].run(function ($rootScope, $state, UserService) {
$rootScope.$on('$stateChangeStart',
function (event, toState) {
if (!!toState.data) {
var required_roles = toState.data.roles;
if (!UserService.has_permission_in(required_roles)) {
event.preventDefault();
$state.go('root.access_forbidden');
}
}
});
});
现在一切都好。我的问题是解决用户权限问题。它由后端提供,并使用$http.get(...)
获取。因为$http
服务返回一个承诺,所以当$stateChangeStart
被触发时,它并不总是有结果。
当应用程序是“温暖的”时,它是“好”的,但是如果我降落在受保护的页面上,它就会失败(数据还没有准备好)。我没有办法“等待”承诺。
什么是在路线上进行访问控制的“好”方法?
发布于 2016-06-22 16:06:24
在受保护状态的定义中:
.state('root.some_page', {
url: '/',
templateUrl: 'some_page.html',
controller: 'home',
resolve: {
access: function($http, $state){ //Note: you can inject your own services/factories too
var requiredPermissions = ['some_right', 'some_other_right'];
return $http.get(...).then(function(response){
var permissions = response.data.permissions;
var granted = permissions.reduce((prev,curr) => requiredPermissions.indexOf(curr) > -1 || prev, false);
if(!granted)
$state.go('publicState');
return permissions;
});
}
}
})
解决方案在进入一个新的状态之前等待承诺和解。
更好的是:
function checkPermissions(requiredPermissions){
return function ($http, $state){ //Note: you can inject your own services/factories too
return $http.get(...).then(function(response){
var permissions = response.data.permissions;
var granted = permissions.reduce((prev,curr) => requiredPermissions.indexOf(curr) > -1 || prev, false);
if(!granted)
$state.go('publicState');
return permissions;
});
}
}
//In state definition
.state('root.some_page', {
url: '/',
templateUrl: 'some_page.html',
controller: 'home',
resolve: {
access: checkPermissions(['first','second'])
}
})
https://stackoverflow.com/questions/37970012
复制相似问题