Angular ui路由器:如何阻止访问一个状态
Angular ui-router: how to prevent access to a state
你好,我是angularJS的新手,一直在尝试根据用户标准阻止访问某些状态。
这篇来自ui路由器常见问题解答的文章准确地描述了我想做什么,但我无法让它正常工作。除了在数据对象中,我还需要什么来实现这一点?
(我看到有人在一些博客文章教程中输入"true",并像我一样使用它,但这似乎不起作用,因为我收到一个错误,说needAdmin没有定义)
这是我的代码:
angular.module('courses').config(['$stateProvider',
function($stateProvider) {
// Courses state routing
$stateProvider.
state('listCourses', {
url: '/courses',
templateUrl: 'modules/courses/views/list-courses.client.view.html'
}).
state('createCourse', {
url: '/courses/create',
templateUrl: 'modules/courses/views/create-course.client.view.html',
data: {
needAdmin: true
}
}).
state('viewCourse', {
url: '/courses/:courseId',
templateUrl: 'modules/courses/views/view-course.client.view.html'
}).
state('editCourse', {
url: '/courses/:courseId/edit',
templateUrl: 'modules/courses/views/edit-course.client.view.html',
data: {
needAdmin: true
}
});
}
]);
angular.module('courses').run(['$rootScope', '$state', 'Authentication', function($rootScope, $state, Authentication) {
$rootScope.$on('$stateChangeStart', function(e, to) {
var auth = Authentication;
console.log(auth.user.roles[0]);
if (to.data.needAdmin && auth.user.roles[0] !== 'admin') {
e.preventDefault();
$state.go('/courses');
}
});
}]);
我发现的最好的方法是使用解析:
$stateProvider.
state('createCourse', {
url: '/courses/create',
templateUrl: 'modules/courses/views/create-course.client.view.html',
resolve: {
security: ['$q', function($q){
if(/*user is not admin*/){
return $q.reject("Not Authorized");
}
}]
}
});
这将触发一个错误,如果不允许用户访问此状态,则会阻止用户访问。
如果您需要显示错误,或将用户发送到不同的状态,请处理$stateChangeError事件:
$rootScope.$on('$stateChangeError', function(e, toState, toParams, fromState, fromParams, error){
if(error === "Not Authorized"){
$state.go("notAuthorizedPage");
}
如果您想检查所有状态的管理员访问权限,可以使用decorator将解析添加到所有状态。类似这样的东西:
$stateProvider.decorator('data', function(state, parent){
var stateData = parent(state);
var data = stateData.data || {};
state.resolve = state.resolve || {};
if(data.needAdmin){
state.resolve.security = ['$q', function($q){
if(/*user is not admin*/){
return $q.reject("Not Authorized");
}
}];
return stateData;
});
我为当前的应用程序实现了类似的功能。如果用户未登录,我们将用户转发到登录表单。如果非管理员用户试图进入任何管理员状态,我们将转发到错误页面。
如果一个状态没有data
,则to.data
未定义。试试这个:
if (to.data && to.data.needAdmin && auth.user.roles[0] !== 'admin') {
相关文章:
- 我如何为列出的选项卡元素编写一个Protractor测试,它会检查它是否's是否处于活动状态
- 制作一个按钮倒计时计时器,该计时器将在5分钟后永久禁用,即使在页面刷新时也应保持禁用状态
- $stateParams,如何将值从一个状态传递到另一个状态
- 将函数的返回传递到另一个状态
- 使用AngularJS在ng重复中从一个状态到另一个状态制作动画
- Angular ui路由器:如何阻止访问一个状态
- 在高图表中显示一个状态的总时间之和
- 使用Angular UI Router,如何使一个状态成为所有状态的子状态
- 角度 UI 路由器 - 在没有参数的情况下从一个状态转换到同一状态失败
- Angular UI路由器:多个URL到一个状态
- 当一个函数必须返回承诺时,我如何在一个状态中实现多个解析
- I'我是javascript新手;我不知道为什么它不会跳到另一个状态
- 如何在转换中获取下一个状态参数
- 鼠标停留在一个状态上,用d3地图改变其他状态的颜色
- 当按钮被点击并重定向到父窗口- SpringBoot时,显示一个状态弹出
- 只跟踪一个状态React
- 需要帮助理解angular ui-router,特别是将mongodb数据从一个状态传递到另一个状态
- ionicHistory美元.手动返回前一个状态时,backView的状态不正确
- Reactjs向一个状态添加一个数字
- 在setState之后落后的一个状态