AngularJS: 阻止用户访问某个状态
AngularJS: Preventing user from accessing a certain state
我正在构建一个使用 sails.js 后端和 angular 前端的应用程序。我试图阻止用户在未获得授权的情况下访问管理控制页面。我已经 运行 找到了几个答案,但其中 none 似乎完全有效。
目前在我的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
但用户未重定向。现在奇怪的是,当之后通过导航栏访问主页并尝试再次访问管理页面时,用户会按预期重定向到主页(尽管在重新加载页面时会出现烦人的 'flash') .
对于其他人的提问,这种处理方式有效,我想知道我可能遗漏了什么,以及为什么我当前的解决方案不起作用的一般原因。
你是 return 成功功能的承诺,这永远不会奏效。
您应该 return defered.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');
});
});
});
我正在构建一个使用 sails.js 后端和 angular 前端的应用程序。我试图阻止用户在未获得授权的情况下访问管理控制页面。我已经 运行 找到了几个答案,但其中 none 似乎完全有效。
目前在我的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
但用户未重定向。现在奇怪的是,当之后通过导航栏访问主页并尝试再次访问管理页面时,用户会按预期重定向到主页(尽管在重新加载页面时会出现烦人的 'flash') .
对于其他人的提问,这种处理方式有效,我想知道我可能遗漏了什么,以及为什么我当前的解决方案不起作用的一般原因。
你是 return 成功功能的承诺,这永远不会奏效。
您应该 return defered.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');
});
});
});