Предотвращение несанкционированных изменений URL в AngularJS на основе HTTP-запроса - PullRequest
0 голосов
/ 24 мая 2019

Я пытаюсь предотвратить навигацию в AngularJS на основе результата HTTP GET к конечной точке авторизации (которая связана с моей архитектурой Spring Security, но это не важно для этого вопроса).

Я прикрепил следующее к блоку run (), прикрепленному к моему модулю верхнего уровня:

    $rootScope.$on("$locationChangeStart", function(event, newUrl, oldUrl) {

        var path = $location.path();
        $http.get('/svc/authorize/view?urlPath=' + path).then(response => {
            if (response.data.result === "NOT_AUTHORIZED") {
                event.preventDefault();
                console.log("Prevented unauthorized location change");
                $ui.showError("Unable to Navigate to " + newUrl);
            }

        });
    });

(Примечание: $ ui - это наш сервис, а не AngularJS или сторонний инструмент).

К сожалению, из-за асинхронного $ http.get () страница загружается до завершения вызова.

Если это поможет, вот пример нашего определения маршрута:

    $routeProvider.when('/problem', {
        templateUrl: '/app/management/problem/problem.tmpl.html',
        controller: 'problemCtrl'
    });

Кто-нибудь может мне помочь? Я надеюсь, что только что сделал глупую ошибку при обработке асинхронного вызова.

1 Ответ

2 голосов
/ 24 мая 2019

Обычно в маршруте используется функция resolve для предотвращения загрузки неавторизованных маршрутов.

$routeProvider.when('/problem', {
    templateUrl: '/app/management/problem/problem.tmpl.html',
    controller: 'problemCtrl',
    resolve: {
        authorized: function($http) {
            return $http(someUrl).then(function(response) {
                var data = response.data;
                if (response.data.result === "NOT_AUTHORIZED") {
                    console.log("Prevented unauthorized location change");
                    throw "NOT AUTHORIZED";
                };
                //ELSE
                return data;
            });
        }
    }
});

Когда функции resolve возвращают обещания, маршрутизатор будет ожидать разрешения или отклонения обещаний, прежде чем будет создан экземпляр контроллера. Если все обещания разрешены успешно, вводятся значения разрешенных обещаний и запускается событие $routeChangeSuccess. Если какое-либо из обещаний отклонено, происходит событие $routeChangeError.

Для получения дополнительной информации см.


Есть ли способ связать функцию авторизованного со всеми маршрутами в одном месте вместо изменения каждого отдельного маршрута?

Код можно повторно использовать для использования услуги:

$routeProvider.when('/problem', {
    templateUrl: '/app/management/problem/problem.tmpl.html',
    controller: 'problemCtrl',
    resolve: { auth: (AuthService,$route) => AuthService.check($route) }
})

Используйте $route.current.params для доступа к предлагаемым параметрам нового маршрута.

...