Если вы пришли из мира Laravel, значит, вы уже знакомы с концепцией Middleware. Если нет, то вот что они делают: они запускаются перед каждым запросом, сделанным маршрутизатором по определенному маршруту. Таким образом, в вашем промежуточном программном обеспечении вы можете авторизоваться, если текущий пользователь может видеть это состояние.

Первое, что вам нужно сделать, это создать новую фабрику и по условию назвать ее somethingMiddleware.js. Я начну с конкретной шахты, authMiddleware, и она будет выглядеть так:

(function () {
    'use strict';

    angular.module('todoozer')
        .factory('authMiddleware', authMiddleware);

    function authMiddleware(authService, $state) {

        var authMiddleware = this;

        //if user is not logged in re-direct to login route
        authMiddleware.run = function(event){
            if(authService.isLoggedIn() == false){
                event.preventDefault();
                console.error('You are not logged in, so you cant browse this');
                $state.go('login');
            }
        };

        return {
            run : authMiddleware.run
        };
    };

})();

У него есть функция run (), которая будет вызываться каждый раз при попадании в это промежуточное ПО, и эта функция просто использует authService, мою модель, и если этот пользователь не вошел в систему, то предотвращает текущее состояние и перенаправляет пользователя. в состоянии «логин».

После того, как вы будете готовы с этим промежуточным программным обеспечением, вы должны внедрить его в состояния, когда оно вам нужно.

$stateProvider
    .state('dashboard', {
        url: '/dashboard',
        templateUrl: 'assets/app/dashboard/dashboard.tmpl.html',
        controller: 'dashboardController',
        controllerAs: 'dashboardCtrl',
        middleware: ['authMiddleware'], /*you can use an array of middleware which means you can add more than one*/
        resolve: {
            recentLists: function (List) {
                return List.getRecent();
            }
        }
    })

Прямо выше я вставляю его в состояние панели управления как атрибут middleWare, используя состояние DDO.

И, наконец, вы должны понять, когда вызывать это промежуточное ПО и как это вызывать. Используя блок выполнения в вашем модуле, вы можете сделать это, и это будет выглядеть так:

.run(function ($state, $rootScope, $injector) {

    //watch when state.current changes, grab it's name and see if it has a middle ware option on DDO
    //if it has execute it's middleware
    $rootScope.$on('$stateChangeStart', function (event, toState, toParams) {
        var currentState = toState;

        callMiddlewares(event, currentState);

        function callMiddlewares(event, state){
            if(state && state.hasOwnProperty('middleware')){
                if (typeof currentState.middleware === 'object') {
                    angular.forEach(state.middleware, function (middleWare) {
                        callMiddleware(middleWare, event);
                    });
                    return;
                }
            }
        }

        function callMiddleware(middleWare, event) {
            try{
                $injector.get(middleWare).run(event);
            }catch(e){
                console.error('the factory : '+ middleWare+' does not exist');
            }
        };
    });
});

В этом блоке выполнения мы должны понять, есть ли у nextState промежуточное ПО, и если оно есть, то разрешить его с помощью $ injector и вызвать его метод run ();

Используя это, вы можете легко собрать логику авторизации в одном месте, что означает единый источник правды. Также увеличена возможность повторного использования кода.