Защита маршрутов в AngularJS

angular
image-879

Если у вас есть какие-то маршруты в AngularJS, которые вы хотите защитить от не авторизованных пользователей, просто создайте функцию, которая будет перенаправлять пользователей на страницу входа, если он не авторизован.

var loginRequired = function($location, $q) {
    var deferred = $q.defer();
    if(! userIsAuthenticated()) {
        deferred.reject()
        $location.path('/login');
    } else {
        deferred.resolve()
    }
    return deferred.promise;
}

И добавьте эту функцию, в маршруты которые требуется проверка подлинности

app.config(['$locationProvider', '$routeProvider',
    function($location, $routeProvider) {
        $routeProvider.
            when('/todos', {
                templateUrl: '/js/templates/todos/index.html',
                controller: 'TodoCtrl',
                resolve: { loginRequired: loginRequired }
            });
    }
]);

Если вам нужно, чтобы пользователь автоматически перенаправляться на урл после авторизации:

var redirectIfAuthenticated = function(route) {
    return function($location, $q) {
        var deferred = $q.defer();
        if (userIsAuthenticated()) {
            deferred.reject()
            $location.path(route);
        } else {
            deferred.resolve()
        }
        return deferred.promise;
    }
}
app.config(['$locationProvider', '$routeProvider',
    function($location, $routeProvider) {
        $routeProvider.
            when('/login', {
                templateUrl: '/js/templates/login.html',
                controller: 'UserCtrl',
                resolve: { redirectIfAuthenticated: redirectIfAuthenticated('/todos') }
            }).
            when('/todos', {
                templateUrl: '/js/templates/todos/index.html',
                controller: 'TodoCtrl',
                resolve: { loginRequired: loginRequired }
            });
    }
]);

Предложенный тут пример больше подходит для учебных целей. Вы не должны полагаться исключительно на сторону клиента в безопасности ваших веб-приложений, так как это легко обойти. Чтобы защитить приложение, в первую очередь лучше использовать серверную часть.