AngularJS:阻止用户访问某个状态
AngularJS: Preventing user from accessing a certain state
我正在使用sails.js后端和angular前端构建一个应用程序。我试图阻止用户在未经授权的情况下访问管理控制页面。我已经找到了几个答案,但似乎没有一个完全有效。
目前在我的app.js中,我有
$stateProvider
.state('home', {
url: "/home",
templateUrl: "home/homeTemplate.html",
controller: 'homeController'
})
.state('adminPage', {
url: "/adminPage",
templateUrl: "adminPage/adminTemplate.html",
controller: 'adminPageController',
resolve: {
validate: function($q, $sails, $location) {
var defer = $q.defer();
$sails.get("/user/getCurrentUser")
.success(function(response) {
if (response.user.accessAdminPage) {
defer.resolve();
}
else {
defer.reject("Access blocked");
$location.path('/');
}
return defer.promise;
})
}
}
})
当前代码正在部分工作;目前的问题是,当未经授权的用户首先登录并登录主页,然后访问localhost:1337/#/adminPage
时,他实际上到达了该页面。地址栏中的url更改为localhost:1337/#/home
,但不会重定向用户。现在奇怪的是,当之后通过导航栏访问主页并试图再次访问管理页面时,用户会按预期重定向到主页(尽管在重新加载页面时会出现令人讨厌的"闪光")。
对于其他人的提问,这种处理方式奏效了,我想知道我可能错过了什么,以及我目前的解决方案不起作用的原因。
您正在从成功函数返回promise,这永远不会起作用。您应该从success函数外部返回defered.promise
(promise对象)。
代码
$stateProvider
.state('home', {
url: "/home",
templateUrl: "home/homeTemplate.html",
controller: 'homeController'
})
.state('adminPage', {
url: "/adminPage",
templateUrl: "adminPage/adminTemplate.html",
controller: 'adminPageController',
resolve: {
validate: function($q, $sails, $location) {
var defer = $q.defer();
$sails.get("/user/getCurrentUser")
.success(function(response) {
if (response.user.accessAdminPage) {
defer.resolve();
} else {
defer.reject("Access blocked");
$location.path('/');
}
});
return defer.promise;
}
}
});
希望这能帮到你,谢谢。
使用pankajparkar提供的解决方案,问题是您必须回复每个状态声明中的逻辑。我建议您在onStateChangeStart
事件中检查用户的授权
angular.module('myApp', ['ui.router'])
.run(function($rootScope, AuthService){
$rootScope.$on('$stateChangeStart',
function(event, next, nextParams, prev, prevParams) {
AuthService.isNotAutorized()
.then(function() {
event.preventDefault();
$state.go('defaultState');
});
});
});
相关文章:
- React Container-来自任一reducer的访问状态
- 如何从一个组件访问另一个组件的状态
- 如何将链接状态设置为在用户访问另一个页面之前保持
- AngularJS:阻止用户访问某个状态
- jQuery成功,访问HTTP状态文本
- Internet Explorer:可以't访问IFrame内容,除非状态代码为200
- RxJ避免外部状态,但仍然访问以前的值
- AngularUI路由器-无法通过URL访问状态
- 如何删除“;被访问”;当我滚动时从链接进入状态
- Angular ui路由器:如何阻止访问一个状态
- 历史记录.js - 直接访问时检测状态
- 如何在 React 中访问孩子的状态
- 如何使用重新选择访问当前的 Redux 状态
- 我可以使用Facebook Graph API访问用户的好友状态吗?
- 为什么 getter 无法访问 React 组件中的状态
- 访问 http 状态代码常量
- 从stateChangeStart中的子状态访问父状态的参数
- 从嵌套状态访问不同的父控制器
- Angular UI路由器-从其他状态访问statesparams
- 将JSON数据分配给变量并通过React中的状态访问它时出错