AngularJS: сохранение информации для входа при обновлении страницы
Я пытаюсь сохранить информацию о пользователе при обновлении страницы. я использовал cookieStore
для этого. Поэтому мой модуль запуска в приложении Angular выглядит следующим образом.
.run(['$rootScope', '$cookieStore', '$state', function($rootScope, $cookieStore, $state) {
$rootScope.$on('$stateChangeStart', function(event, toState, toParams, $location){
var requireLogin = toState.data.requireLogin;
if(typeof $rootScope.user == 'undefined'){
$rootScope.user=$cookieStore.get("user");
$rootScope.sessionid=$cookieStore.get("session");
}
if(requireLogin && typeof $rootScope.user === 'undefined'){
event.preventDefault();
$state.go('login', null, {notify: false}).then(function(state) {
$rootScope.$broadcast('$stateChangeSuccess', state, null);
});
}
});
Вот две основные вещи, которые я хотел бы достичь:
- Должен получить
user
а такжеsession
информация из локального хранилища браузера, когда страница обновляется. - Если пользователь не определен, он должен быть перенаправлен на страницу входа. Он предназначен для ограничения доступа пользователей к промежуточным страницам без входа в систему.
Если пользователь undefined
и данные не доступны в локальном хранилище, первый if statement
выдает ошибку и второе if statement
не работает.
Таким образом, когда пользователь пытается зайти на какую-либо страницу в первый раз, не заходя на страницу входа, он не перенаправляет на страницу входа, потому что код сначала не удался if statement
, второй if
не работает.
Как я могу достичь обеих функций вместе?
Спасибо
2 ответа
Вы можете создать authInterceptor
завод и вставь interceptors
,
Этот метод всегда проверяет, вошел ли пользователь в систему или нет на каждой странице, и выбрасывает пользователя на страницу входа, если он не аутентифицирован.
В целях глобальной обработки ошибок, аутентификации или любого вида синхронной или асинхронной предварительной обработки запроса или постобработки ответов желательно иметь возможность перехватывать запросы, прежде чем они будут переданы на сервер, и ответы, прежде чем они будут переданы код приложения, который инициировал эти запросы. Перехватчики используют API-интерфейсы обещаний для удовлетворения этой потребности как в синхронной, так и в асинхронной предварительной обработке.
Узнайте больше о перехватчиках
'use strict';
angular.module('app', [
'ngCookies',
'ngResource',
'ngSanitize',
'ngRoute'
])
.config(function($routeProvider, $locationProvider, $httpProvider) {
$routeProvider
.otherwise({
redirectTo: '/'
});
$httpProvider.interceptors.push('authInterceptor');
})
.factory('authInterceptor', function($rootScope, $q, $cookieStore, $location) {
return {
// Add authorization token to headers
request: function(config) {
config.headers = config.headers || {};
if ($cookieStore.get('token')) {
config.headers.Authorization = 'Bearer ' + $cookieStore.get('token');
}
return config;
},
// Intercept 401s and redirect you to login
responseError: function(response) {
if (response.status === 401) {
$location.path('/login');
// remove any stale tokens
$cookieStore.remove('token');
return $q.reject(response);
} else {
return $q.reject(response);
}
}
};
})
.run(function($rootScope, $location, Auth) {
// Redirect to login if route requires auth and you're not logged in
$rootScope.$on('$routeChangeStart', function(event, next) {
Auth.isLoggedInAsync(function(loggedIn) {
if (next.authenticate && !loggedIn) {
$location.path('/login');
}
});
});
})
.factory('Auth', function Auth($location, $rootScope, $http, User, $cookieStore, $q) {
var currentUser = {};
if ($cookieStore.get('token')) {
currentUser = User.get();
}
return {
/**
* Gets all available info on authenticated user
*
* @return {Object} user
*/
getCurrentUser: function() {
return currentUser;
},
/**
* Check if a user is logged in
*
* @return {Boolean}
*/
isLoggedIn: function() {
return currentUser.hasOwnProperty('role');
},
/**
* Waits for currentUser to resolve before checking if user is logged in
*/
isLoggedInAsync: function(cb) {
if (currentUser.hasOwnProperty('$promise')) {
currentUser.$promise.then(function() {
cb(true);
}).catch(function() {
cb(false);
});
} else if (currentUser.hasOwnProperty('role')) {
cb(true);
} else {
cb(false);
}
}
};
})
.factory('User', function($resource) {
return $resource('/api/users/:id/:controller', {
id: '@_id'
}
});
});
С вышеупомянутым механизмом, вы можете использовать Auth
сервис, чтобы получить user
информация в любом controller
или же directives
как:
.controller('MainCtrl', function ($scope, Auth) {
$scope.currentUser = Auth.getCurrentUser;
});
в файле шаблона:
<div ng-controller="MainCtrl">
<p> Hi {{currentUser().name}}!</p>
</div>
Примечание: вам нужно создать правильный API REST, чтобы получить правильный user
данные
Я хотел бы изучить с помощью ngStorage. Я использую объект sessionStorage, который будет сохранять данные даже при обновлении. Если вам нужен дальнейший пример внедрения, пожалуйста, дайте мне знать, но документация отличная.