Javascript 用户界面路由器权限/访问控制
我在决定如何向Angular应用程序添加权限/访问控制时遇到了很多麻烦。现在我们有:Javascript 用户界面路由器权限/访问控制,javascript,angularjs,angular-ui-router,Javascript,Angularjs,Angular Ui Router,我在决定如何向Angular应用程序添加权限/访问控制时遇到了很多麻烦。现在我们有: app.config(['$stateProvider', function ($stateProvider) { $stateProvider .state('default', { url: '', templateUrl: 'pages/home/view/home.html', controller: 'HomeCtrl
app.config(['$stateProvider', function ($stateProvider) {
$stateProvider
.state('default', {
url: '',
templateUrl: 'pages/home/view/home.html',
controller: 'HomeCtrl'
})
.state('home', {
url: '/home',
templateUrl: 'pages/home/view/home.html',
controller: 'HomeCtrl',
permissions: { // ?
only: ['Admin','Moderator']
},
access: { // ?
roles: ['*']
},
resolve: { // ?
authenticate: function($state, $q, $timeout){
},
}
})
}]);
我无法确定使用哪种方法来创建对每个页面的访问控制
现在,登录的用户存储在角度值中:
app.value('USER', JSON.parse('{{{user}}}'));
用户值包含有关用户具有哪些角色/权限的信息
但我无法将用户注入app.config()
回调,它显示“未知提供者”
如何根据用户参数进行访问控制?执行该操作的关键是在事件$stateChangeStart上添加访问控制 例如,如果您的路线是这样的:
.state('termsofuse', {
url: "/terms",
templateUrl: "termOfUse.html",
resolve: {
authorizedRoles: function() {
return [USER_ROLES['su'],
USER_ROLES['user'],
USER_ROLES['admin'],
USER_ROLES['skysu']
]
}
}
})
您可以这样定义您的访问控制
.run(
function($rootScope, $q, $location, $window, $timeout) {
$rootScope.$on(
'$stateChangeStart',
function(event, next, current) {
var authorizedRoles = next.resolve.authorizedRoles();
//this function controls if user has necessary roles
if (!isAuthorized(authorizedRoles)) {
event.preventDefault();
// and I broadcast the news $rootScope.$broadcast("AUTH_EVENTS.notAuthenticated");
} else {
$rootScope.$broadcast("AUTH_EVENTS.loginSuccess");
}
})
});
然后,您只需定义事件的捕获器来管理所需的行为(重定向/错误消息或任何必要的行为)执行该操作的关键是在事件$stateChangeStart上添加访问控制 例如,如果您的路线是这样的:
.state('termsofuse', {
url: "/terms",
templateUrl: "termOfUse.html",
resolve: {
authorizedRoles: function() {
return [USER_ROLES['su'],
USER_ROLES['user'],
USER_ROLES['admin'],
USER_ROLES['skysu']
]
}
}
})
您可以这样定义您的访问控制
.run(
function($rootScope, $q, $location, $window, $timeout) {
$rootScope.$on(
'$stateChangeStart',
function(event, next, current) {
var authorizedRoles = next.resolve.authorizedRoles();
//this function controls if user has necessary roles
if (!isAuthorized(authorizedRoles)) {
event.preventDefault();
// and I broadcast the news $rootScope.$broadcast("AUTH_EVENTS.notAuthenticated");
} else {
$rootScope.$broadcast("AUTH_EVENTS.loginSuccess");
}
})
});
然后,您只需定义事件的捕获器来管理所需的行为(重定向/错误消息或任何必要的行为)这就是我如何使其工作的。我不确定这是否是最好的方法,但它确实有效 无法在app.config()中插入服务/值,但可以将服务/值插入resolve.authenticate函数 我决定使用resolve.authenticate方法
.state('home', {
url: '/home',
templateUrl: 'pages/home/view/home.html',
controller: 'HomeCtrl',
resolve: {
authenticate: handlePageRequest['home'] // <<<<
}
})
我就是这样让它工作的。我不确定这是否是最好的方法,但它确实有效 无法在app.config()中插入服务/值,但可以将服务/值插入resolve.authenticate函数 我决定使用resolve.authenticate方法
.state('home', {
url: '/home',
templateUrl: 'pages/home/view/home.html',
controller: 'HomeCtrl',
resolve: {
authenticate: handlePageRequest['home'] // <<<<
}
})
您可能想签出,我将它与ui路由器一起使用。您可能想签出,我将它与ui路由器一起使用。
app.value()
无法注入配置块。:。使用app.constant()
insteadcool,这很好,但在这种情况下,使用resolve.authenticate,我们可以注入任何东西,因此不需要该解决方案tmk。如果您可以更新到UI Router 1.0,转换挂钩是实现这一点的最佳方法。当然,添加一个答案,我将向上投票app.value()
无法注入配置块。:。使用app.constant()
insteadcool,这很好,但在这种情况下,使用resolve.authenticate,我们可以注入任何东西,因此不需要该解决方案tmk。如果您可以更新到UI Router 1.0,转换挂钩是实现这一点的最佳方法。当然,添加一个答案,我将投票