Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs ui路由器解析与安全运行_Angularjs_Security_Angular Ui Router_Angular Promise - Fatal编程技术网

Angularjs ui路由器解析与安全运行

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返回

我很好奇其他人在应用程序的路由安全方面做了什么。首先,我们通过从angular中的.run方法调用安全服务来实现安全性

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,并在后端验证该用户是否有权访问路由。我们不在客户端进行检查,因为无论您需要在服务器端检查什么