如何使用角度权限库定义权限时执行异步任务

时间:2019-02-26 12:05:23

标签: angularjs angular-ui-router satellizer angular-permission angularjs-1.7

我正在使用angular-permission库和ui-routersatellizer

以下是home的状态定义。在此,我要检查用户是否已使用angular-permission进行授权。

$stateProvider.state('500', home);
var home = {
  abstract: true,
  url: '/home',
  data: {
    permissions: {
      only: ['loggedin',],
      redirectTo: {
        loggedin: 'login',
      },
    }
  },
  templateUrl: 'components/home/home.view.html',
  controller: 'HomeCtrl as home'
};

以下是loggedin的权限定义

PermPermissionStore.definePermission('loggedin', isAuthenticated);

function isAuthenticated(permissionName, transitionProperties) {
  // check if token is valid.
  if ($auth.isAuthenticated()) {
    return true;
  }
  // if not then refresh token
  return tokenRestService.refresh().then(
    function (response) {
      if (response != null) {
        $auth.setToken(response);
      }
    },
    function (response) {
      localStorage.removeItem('user');
    }
  );
}

但是当我执行异步调用时,它有些不起作用。如果我按以下方式更改isAuthenticated函数,则它可以正常工作,但是如果令牌过期,我需要刷新令牌,否则,将用户重定向到登录页面。

function isAuthenticated(permissionName, transitionProperties) {
  if ($auth.isAuthenticated()) {
    return true;
  }
  return false;
}

从角度许可的doc

  

有时候,您需要调用一些后端api或执行其他一些操作   异步任务,以检查权限是否仍然有效。为此你   可以使用promise并简单地从验证函数中返回它们:

PermPermissionStore
  // Define user permission calling back-end
  .definePermission('hasValidSession', /*@ngInject*/function (Session) {
    // Let's assume that Session service calls backend API via $http and return promise:
    // -- $q.resolve() means that session is active 
    // -- $q.reject() means that session expired
    return Session.checkSession();
  });

但是,当我在definePermission中使用服务时,它只是通过而没有任何重定向。

1 个答案:

答案 0 :(得分:2)

遵循文档:

 -- $q.resolve() means that session is active 
 -- $q.reject() means that session expired

将已解决或已拒绝的承诺返回给.then方法:

PermPermissionStore.definePermission('loggedin', isAuthenticated);

function isAuthenticated(permissionName, transitionProperties) {
  // check if token is valid.
  if ($auth.isAuthenticated()) {
    return true;
  }
  // if not then refresh token
  return tokenRestService.refresh().then(
    function (response) {
      if (response != null) {
        $auth.setToken(response);
      }
      return $q.resolve();
    },
    function (response) {
      localStorage.removeItem('user');
      return $q.reject();
    }
  );
}