Angularjs ui路由器解析与安全运行
我很好奇其他人在应用程序的路由安全方面做了什么。首先,我们通过从angular中的.run方法调用安全服务来实现安全性Angularjs ui路由器解析与安全运行,angularjs,security,angular-ui-router,angular-promise,Angularjs,Security,Angular Ui Router,Angular Promise,我很好奇其他人在应用程序的路由安全方面做了什么。首先,我们通过从angular中的.run方法调用安全服务来实现安全性 app.run(function ($rootScope, $state, SecuirtyService){ SecurityService.initSecurity().then(function(data){}); } 然后,SecurityService.initSecurity将进行rest调用,以查看用户拥有哪些权限。问题在于,由于.initSecurity返回
app.run(function ($rootScope, $state, SecuirtyService){
SecurityService.initSecurity().then(function(data){}); }
然后,SecurityService.initSecurity将进行rest调用,以查看用户拥有哪些权限。问题在于,由于.initSecurity返回了一个承诺,因此应用程序的其余部分将一直执行,直到$http决定执行调用,从而在未完成安全检查的情况下加载UI
所以为了解决这个问题,我在我们的ui路由器中为每个州添加了一个解决方案。这确保在加载控制器之前完成.initSecurity
Header: {
templateUrl: "header/headerBar.html",
controller: "HeaderController as headerCtrl",
resolve: {
security: function(SecurityService){
return SecurityService.initSecurity();
}
}
},
问题是,在加载每个页面之前调用.initSecurity,这看起来非常冗余
在一个完美的世界中,.run方法在承诺实现之前是不会完成的,但看起来这并没有发生
我的问题是,您如何对应用程序实施安全检查?你是从.run方法启动它的吗?或者让它成为解决方案的一部分是一个有效的选择吗?您可以使用
延迟截获
暂停初始路由,直到异步检查完成。然后使用listen
和sync
开始路由
myapp.config(function ($urlRouterProvider) {
$urlRouterProvider.deferIntercept();
})
myapp.run(function (SecurityService, $urlRouter) {
SecurityService.initSecurity()
.then(function(data){
$urlRouter.listen();
$urlRouter.sync();
});
});
您可以使用
deferIntercept
暂停初始路由,直到异步检查完成。然后使用listen
和sync
开始路由
myapp.config(function ($urlRouterProvider) {
$urlRouterProvider.deferIntercept();
})
myapp.run(function (SecurityService, $urlRouter) {
SecurityService.initSecurity()
.then(function(data){
$urlRouter.listen();
$urlRouter.sync();
});
});
您可以创建一个父状态(我们称之为auth)并从中解析安全性
$stateProvider
.state('auth', {
abstract: true,
resolve: {
security: function(SecurityService) {
// Will resolve once if transferring between auth states
return SecurityService.initSecurity();
}
}
})
.state('auth.profile', {
...
});
您可以创建一个父状态(我们称之为auth)并从中解析安全性
$stateProvider
.state('auth', {
abstract: true,
resolve: {
security: function(SecurityService) {
// Will resolve once if transferring between auth states
return SecurityService.initSecurity();
}
}
})
.state('auth.profile', {
...
});
我们正在使用cookies,并在后端验证该用户是否有权访问该路由。我们不是在客户端检查,因为无论您需要在服务器端检查什么,我们都在使用cookies,并在后端验证该用户是否有权访问路由。我们不在客户端进行检查,因为无论您需要在服务器端检查什么