Обещание разрешения маршрута, не полностью разрешено - angularjs

Итак, я пытаюсь сделать что-то простое:

  1. проверьте роль loggedUser на каждом маршруте (с разрешением, которое устанавливает пользователя, если токен или учетные данные для входа действительны на серверной части)
  2. перенаправить на предполагаемый маршрут
  3. если это не разрешено для маршрута, перенаправить на другой маршрут

В моем поставщике маршрутов у меня есть что-то вроде

$routeProvider
  ...
  .when('/admin', {
    templateUrl: 'views/admin/dashboard.html',
    controller: 'AdminDashboardCtrl',
    resolve: {
      checkLoggedUser: check
    }
  })
  ...

где ckeck это функция

var check = function($rootScope, $q, AuthService) {
  var deferred = $q.defer();

  if($rootScope.loggedUser) {
    return;
  }

  console.log('inside resolve check')

  AuthService.check().success(function(data) {
    $rootScope.loggedUser = data.user;
    deferred.resolve(data.user);
  });

  console.log('finished check')

  return deferred.promise;
};

И моя AuthService.check() - это эта функция

check: function()
  {
    var authtoken = StorageService.get('authtoken');
    if(!authtoken) {
      $location.path('login');
    }

    console.log('before returning');

    return $http.post($rootScope.base + 'auth/authenticate', { 'authtoken': authtoken });
  },

В моем .run(функция у меня есть

$rootScope.$on('$routeChangeSuccess', function() {
  setIntendedUrl();
  console.log($rootScope.loggedUser);
  console.log($location.path());
});

и setIntendedUrl() проверяют loggedUser и перенаправляют на правильную страницу (или, в том, что я пытаюсь выполнить, перенаправляют на другую страницу, если это не разрешено, например, loggedUser имеет роль = 1, может посещать только маршруты / admin, если у пользователя есть роль = 2, а запрошенный путь /admin, его нужно перенаправить на /user)

Итак, после всего этого кода, когда приложение запускается, это мой журнал в консоли (см. В коде, где они вызываются)

inside resolve check app.js:29
before returning authservice.js:24
finished check app.js:36
intended: /admin/agents/create app.js:149 <--- here is where I redirect the user
Object {id: "21", name: "Kyle", surname: "Butler", roleId: "2"...} app.js:167
/admin/agents/create <--- requested path

Это не то, чего я ожидал, поэтому первые три журнала хороши, третий не ждет, когда обещание будет возвращено (поэтому у меня нет loggedUser), затем AuthService:check() возвращает пользователя, и это все сделано на данный момент, пользователь с ролью = 2 находится на маршруте, который не разрешен для просмотра.

Просто чтобы завершить код, это функция setIntendedUrl

var setIntendedUrl = function() {
  intended = $location.path();
  console.log('intended: ' + intended)
  if(intended !== '/login') {
    if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '1' &&  !/^\/admin*/.test(intended)) {
      intended = '/admin';
    } else if($rootScope.loggedUser && $rootScope.loggedUser.roleId === '2' &&  !/^\/manager*/.test(intended)) {
      intended = '/manager';
    }
    StorageService.set('intended', intended);
    //$location.path(intended);
  }
};

Что я делаю неправильно? Почему пользователь в функции проверки не разрешается до выполнения другого кода?


person peppeocchi    schedule 07.11.2014    source источник


Ответы (1)


Можете ли вы использовать хранилище сеансов/локальных данных или $rootScope, где вы можете хранить объект авторизации пользователей с заданными маршрутами, информацию о разрешениях после входа пользователя в систему.

Теперь в блоке разрешения маршрута или запуска () вы можете получить объект аутентификации пользователя, выполняющий действие авторизации.

e.g.

.run(['sessionService', '$rootScope', '$location', function(sessionService, $rootScope, $location) {
$rootScope.$on( "$routeChangeStart", function(event, next, current) {
    var currentUser = sessionService.get('user_details');

    if(next.taskAccess && next.taskAccess != ""){
        var hasPerm = $rootScope.getPermission(next.taskAccess);
        if(!hasPerm){
             $location.path('/unauthorized');
        }
    }
});

}]);

person Hrishikesh    schedule 07.11.2014
comment
Извините, я не понимаю ваш код, почему я должен брать из локальных данных зарегистрированные данные пользователя, если я непосредственно перед этим прошу сервер аутентифицировать пользователя (и отправить мне данные)? это также слишком легко сломать и получить доступ к неразрешенным маршрутам, просто откройте консоль и установите/измените значение в локальных данных. Я тоже не понимаю, что такое taskAccess и где ставится. Извините за это, не могли бы вы попытаться объяснить это лучше, пожалуйста? - person peppeocchi; 07.11.2014