Если вы пришли из мира 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 ();
Используя это, вы можете легко собрать логику авторизации в одном месте, что означает единый источник правды. Также увеличена возможность повторного использования кода.