防止基于HTTP请求的AngularJS中未经授权的URL更改
我试图阻止基于HTTP访问授权端点的结果在AngularJS中导航(这与我的Spring安全体系结构有关,但这对这个问题并不重要) 我已将以下内容附加到附加到顶级模块的run()块:防止基于HTTP请求的AngularJS中未经授权的URL更改,angularjs,ngroute,Angularjs,Ngroute,我试图阻止基于HTTP访问授权端点的结果在AngularJS中导航(这与我的Spring安全体系结构有关,但这对这个问题并不重要) 我已将以下内容附加到附加到顶级模块的run()块: $rootScope.$on("$locationChangeStart", function(event, newUrl, oldUrl) { var path = $location.path(); $http.get('/svc/authorize/view?urlP
$rootScope.$on("$locationChangeStart", function(event, newUrl, oldUrl) {
var path = $location.path();
$http.get('/svc/authorize/view?urlPath=' + path).then(response => {
if (response.data.result === "NOT_AUTHORIZED") {
event.preventDefault();
console.log("Prevented unauthorized location change");
$ui.showError("Unable to Navigate to " + newUrl);
}
});
});
(注意:$ui是我们的服务,不是AngularJS或第三方工具)
不幸的是,由于异步$http.get(),页面在调用完成之前加载
如果有帮助,以下是路线定义的示例:
$routeProvider.when('/problem', {
templateUrl: '/app/management/problem/problem.tmpl.html',
controller: 'problemCtrl'
});
有人能帮我吗?我希望我只是在处理异步调用时犯了一个愚蠢的错误。人们通常在路由中使用
resolve
函数来防止未经授权的路由加载
$routeProvider.when('/problem', {
templateUrl: '/app/management/problem/problem.tmpl.html',
controller: 'problemCtrl',
resolve: {
authorized: function($http) {
return $http(someUrl).then(function(response) {
var data = response.data;
if (response.data.result === "NOT_AUTHORIZED") {
console.log("Prevented unauthorized location change");
throw "NOT AUTHORIZED";
};
//ELSE
return data;
});
}
}
});
当resolve
函数返回承诺时,路由器将等待承诺被解析或拒绝,然后再实例化控制器。如果成功解析所有承诺,则注入已解析承诺的值并触发事件。如果任何承诺被拒绝,事件将被触发
有关详细信息,请参阅
是否有一种方法将授权中的功能与单个位置的所有路由关联,而不是修改每个单独的路由 可以重新分解代码以使用服务:
$routeProvider.when('/problem', {
templateUrl: '/app/management/problem/problem.tmpl.html',
controller: 'problemCtrl',
resolve: { auth: (AuthService,$route) => AuthService.check($route) }
})
使用
$route.current.params
访问建议的新路由的参数。通常在路由中使用解析
功能来防止未经授权的路由加载
$routeProvider.when('/problem', {
templateUrl: '/app/management/problem/problem.tmpl.html',
controller: 'problemCtrl',
resolve: {
authorized: function($http) {
return $http(someUrl).then(function(response) {
var data = response.data;
if (response.data.result === "NOT_AUTHORIZED") {
console.log("Prevented unauthorized location change");
throw "NOT AUTHORIZED";
};
//ELSE
return data;
});
}
}
});
当resolve
函数返回承诺时,路由器将等待承诺被解析或拒绝,然后再实例化控制器。如果成功解析所有承诺,则注入已解析承诺的值并触发事件。如果任何承诺被拒绝,事件将被触发
有关详细信息,请参阅
是否有一种方法将授权中的功能与单个位置的所有路由关联,而不是修改每个单独的路由 可以重新分解代码以使用服务:
$routeProvider.when('/problem', {
templateUrl: '/app/management/problem/problem.tmpl.html',
controller: 'problemCtrl',
resolve: { auth: (AuthService,$route) => AuthService.check($route) }
})
使用
$route.current.params
访问建议的新路由的参数。通常在路由中使用resolve
功能来防止加载未经授权的路由。通常在路由中使用resolve
功能来防止加载未经授权的路由。是否有方法将该功能关联到授权所有路线在一个地方,而不是修改每个单独的路线?服务是一个方向。然而,$routeProvider中是否有一个参数,我可以迭代for/foreach循环中的所有路由,并将此服务附加到它?工作非常出色。谢谢。有没有一种方法可以将授权中的功能与一个地方的所有路线相关联,而不是修改每个单独的路线?服务是一种方法。然而,$routeProvider中是否有一个参数,我可以迭代for/foreach循环中的所有路由,并将此服务附加到它?工作非常出色。非常感谢。