【问题标题】:ui-router resolve vs .run for securityui-router resolve 与 .run 的安全性
【发布时间】:2017-10-05 13:56:48
【问题描述】:

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

app.run(function ($rootScope, $state, SecuirtyService){ 
SecurityService.initSecurity().then(function(data){}); }

SecurityService.initSecurity 然后会进行一次休息调用以查看用户拥有哪些权限。这样做的问题是,由于 .initSecurity 返回一个承诺,应用程序的其余部分将执行,直到 $http 决定执行调用以加载 UI 而没有完成安全检查。

所以为了解决这个问题,我在我们的 ui-router 中为我们的每个状态添加了一个决心。这确保我们的 .initSecurity 在控制器加载之前得到满足。

Header: {
          templateUrl: "header/headerBar.html",
          controller: "HeaderController as headerCtrl",
          resolve: {
            security: function(SecurityService){
              return SecurityService.initSecurity();
            }
          }
        },

问题在于 .initSecurity 在每个页面加载之前被调用,这看起来非常多余。

在一个完美的世界中, .run 方法在承诺完成之前不会完成,但https://github.com/angular/angular.js/issues/4003 看起来并没有发生。

我的问题是您如何对您的应用程序实施安全检查?您是否以某种方式从 .run 方法中触发它?还是将其作为解决方案的一部分是一个有效的选择?

【问题讨论】:

  • 我们正在使用 cookie,并在后端验证该用户是否有权访问该路由。我们不在客户端检查,因为无论您需要在服务器端检查什么

标签: angularjs security angular-ui-router angular-promise


【解决方案1】:

您可以创建父状态(我们称之为身份验证)并从那里解决安全问题。

$stateProvider
 .state('auth', {
  abstract: true,
  resolve: {
   security: function(SecurityService) {
     // Will resolve once if transferring between auth states
     return SecurityService.initSecurity(); 
   }
  }
 })
 .state('auth.profile', {
  ...
 });

【讨论】:

    【解决方案2】:

    您可以使用deferIntercept 暂停初始路由,直到异步检查完成。然后使用listensync 开始路由。

    myapp.config(function ($urlRouterProvider) {
      $urlRouterProvider.deferIntercept();
    })
    
    myapp.run(function (SecurityService, $urlRouter) {
      SecurityService.initSecurity()
      .then(function(data){
        $urlRouter.listen();
        $urlRouter.sync();
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-16
      • 2016-11-14
      • 1970-01-01
      • 2014-03-30
      • 2017-02-25
      相关资源
      最近更新 更多