您可以创建一些像这样的常量角色:
.constant('USER_ROLES', {
ALL: '*', //@unused
ADMIN: 'ROLE_ADMIN';
USER: 'ROLE_USER',
ANONYMOUS: 'ROLE_ANONYMOUS'
})
将此自定义数据/常量添加到您的状态中:
$stateProvider.state('myapp.admin', {
url: '/admin',
.....
data : {
authorizedRoles : [USER_ROLES.ADMIN] //Thes
}
}
因此,当您从数据库中验证和检索这些角色时,您可以将其存储在您的用户对象和会话中,以便您最终可以在路由更改时验证这一点...
在您的身份验证服务中(除了登录、注销等),您添加以下方法。
isAuthenticated: function () {
return session.hasSession();
},
isAuthorized: function (authorizedRoles) {
if (!angular.isArray(authorizedRoles)) {
authorizedRoles = [authorizedRoles];
}
var roles = session.roles();
var roleIncluded = roles.some(function (role) {
return (authorizedRoles.indexOf(role) != -1);
});
return (session.hasSession() && roleIncluded);
},
因此,当您更改应用程序中的路线时.run
进行块验证并且可以进行预防。
$rootScope.$on('$stateChangeStart', function (event, next) {
if (authService.isAuthenticated()) {
if (next.data.authorizedRoles === null) {
handle();
}
if (!authService.isAuthorized(next.data.authorizedRoles)) {
handle();
}
} else {
handle();
}
}
当然,这只是一个示例,请记住还有其他解决方案。