一尘不染

角路由异步授权

angularjs

Angular在路由上不提供任何授权/访问权限(我说的是默认的Angular路由1.x,而不是beta 2.0或UI路由)。但是我必须执行它。

我遇到的问题是我有一项服务,该服务调用服务器以提供此信息并返回承诺。但是,此数据仅获取一次,然后缓存在客户端上,但是仍然需要获取一次。

我现在想处理$routeChangeStart检查下一条路由是否定义了特定属性的事件authorize: someRole。然后,该处理程序应使用我前面提到的服务获取该数据,并根据返回的数据采取相应的措施。

除了为我的所有路线添加 解析度之外 ,还有其他想法吗?我可以以某种方式集中进行此操作吗?一旦适用所有路线?

最终解决方案

借助公认的答案,我能够实现一个相当简单且集中的解决方案,该解决方案可以进行异步授权。单击此处查看其运行状况或查看其内部工作代码。


阅读 237

收藏
2020-07-04

共1个答案

一尘不染

最简单的方法是处理当前路由的解析依赖性,并且$routeChangeStart是管理此路由的好地方。这是一个例子

app.run(function ($rootScope, $location) {
  var unrestricted = ['', '/login'];

  $rootScope.$on('$routeChangeStart', function (e, to) {
    if (unrestricted.indexOf(to.originalPath) >= 0)
      return;

    to.resolve = to.resolve || {};
    // can be overridden by route definition
    to.resolve.auth = to.resolve.auth || 'authService';
  });

  $rootScope.$on('$routeChangeError', function (e, to, from, reason) {
    if (reason.noAuth) {
      // 'to' path and params should be passed to login as well
      $location.path('/login');
    }
  });
});

另一个选择是将default方法添加到$routeProvider和修补$routeProvider.when以扩展默认对象的路由定义。

2020-07-04