在我的angularjs应用中,我有路由/#/tasks
,它从/tasks
网址获取任务。如果用户手动转到/tasks
url,他会获取json数据。我应该阻止向用户显示json数据吗?什么是最佳做法?例如,在后端我可以检查请求是否是ajax。如果不是 - 重定向到基本网址。后端 - laravel 5
。
答案 0 :(得分:1)
从包含关键字“阻止用户”的帖子标题中,您似乎需要某种逻辑来定义特定用户的访问权限。
您可以坚持在用户访问路线 之前解析授权逻辑 。
为此,您可以利用resolve
方法的$routeProvider
.when()
属性。
根据docs,resolve
属性是......
应该注入控制器的可选依赖关系图。如果这些依赖项中的任何一个是promise,路由器将等待它们全部被解析或者在实例化控制器之前被拒绝。
如果所有承诺都成功解决,则会注入已解析的承诺的值,并触发$ routeChangeSuccess事件。如果任何promise被拒绝,则触发$ routeChangeError事件。
解析接受函数(作为可注入的依赖项),每个函数都可以返回 promise ,如果任何promises被拒绝,如引用,则抛出错误并且字面上都不是路由也没有加载视图。
要使授权逻辑起作用,您需要对某些后端函数/服务执行一些API调用,该函数/服务会解析用户被允许用于路由,或者拒绝他/她的请求。
.when('/tasks', {
resolve: {
authorize: function(authService){
//some api call to get either acceptance (e.g. status code 200) or rejection (status code 500) for the user being authorized
return authService.authorize();
}
},
controller: function(){
//route controller logic
}
})
或者,如果您还希望在承诺失败时执行某些操作,则可以通过简单地使用catch()
处理程序链接promise并抛出错误强制拒绝从catch()
本身。
.when('/tasks', {
resolve: {
authorize: function($location, authService){
//some api call to get either acceptance or rejection for the user being
return authService.authorize()
.then(function(){
//some logic on success of the promise
})
.catch(function(){
$location.path('/auth/login/');
throw 'Authorization error';
});
}
},
controller: function(){
//route controller logic
}
})