我正在使用sails.js后端和前端角度来构建应用。我试图阻止用户访问管理控制页面,如果他没有被授权。我已经遇到了几个答案,但它们似乎都没有完全发挥作用。
在我的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
时,他实际上到达了该页面。地址栏中的网址更改为localhost:1337/#/home
,但未重定向用户。现在奇怪的是,当之后通过导航栏访问主页并尝试再次访问管理页面时,用户被重定向到主页(尽管在重新加载页面时会出现恼人的'闪存')。 / p>
对于其他人的询问,这种处理方式有效,我想知道我可能错过了什么,以及为什么我目前的解决方案无效的原因。
答案 0 :(得分:1)
您将从成功函数返回承诺,这将永远不会有效。
您应该从外部成功函数返回defered.promise
(promise对象)。
<强> CODE 强>
$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;
}
}
});
希望这可以帮助你,谢谢。
答案 1 :(得分:0)
使用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');
});
});
});