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