Я пишу cms front-end в Angular JS, и я не знаю, как разрешить пользователю разрешить пользователю просматривать конкретный контент при первой загрузке приложения. У меня есть рабочее решение, когда пользователь уже входит в систему и просто перемещается со страницы на страницу. Я делаю это так:Угловая авторизация JS - проверьте роль пользователя перед загрузкой страницы
angular.module("myApp")
.run ($rootScope, AUTH_EVENTS, AuthServ) ->
$rootScope.$on '$stateChangeStart', (event, next) ->
if next.data
authorizedRoles = next.data.authorizedRoles
unless AuthServ.isAuthorized(authorizedRoles)
event.preventDefault()
if AuthServ.isAuthenticated()
$rootScope.$broadcast(AUTH_EVENTS.notAuthorized)
else
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated)
Когда пользователь изменить маршрут, то AuthServ.isAuthorized (authorizedRoles) обжигают.
Когда пользователь входит в систему, я получаю токены и пользовательские данные с сервера. Токен хранится в локальном хранилище, а данные пользователя хранятся в памяти (в области верхнего уровня контроллера). В пользовательских данных у меня есть информация о его роли, поэтому я могу проверить, разрешено ли ему видеть конкретный контент.
Теперь предположим, что пользователь вошел в систему, и он перезагрузит страницу. У меня все еще есть токен, поскольку он находится в localStorage, но я теряю пользовательские данные (поэтому я не знаю, какова его роль). Я не хочу показывать какой-либо контент пользователю, прежде чем я получу его данные снова с сервера. Итак, мой вопрос - как решить это? Где и когда я должен сделать запрос на сервер для пользовательских данных?
Я думал, что решение может быть связано с ручной загрузкой приложения. Я пытался сделать что-то вроде этого:
app = angular.module('myApp', [])
fetchData = ->
\t injector = angular.injector(['ng'])
\t $http = injector.get('$http')
\t API_URI = injector.get('API_URI')
\t $localStorage = injector.get('$localStorage')
\t $http.get("#{API_URI}/users/me?token=#{$localStorage.token}")
\t \t .success (data) ->
\t \t \t app.constant('USER_DATA', data)
bootstrapApplication = ->
\t angular.element(document).ready ->
\t \t angular.bootstrap(document, ['myApp'])
fetchData().then(bootstrapApplication)
Проблема с этим кодом является то, что у меня нет доступа к сервису $ LocalStorage и постоянной API_URI. Мне нужно, чтобы они получили токен и динамически изменяли URL-адрес (разработка, производство).
Итак, что является лучшим решением? Возможно, хранение роли пользователя в локальном хранилище?
Любая помощь была бы оценена, спасибо.
У меня нет проблем с сохранением пользовательских данных при навигации между страницами. Как вы упомянули, пользовательские данные фактически хранятся в отдельной службе, а в контроллере я просто назначаю их в область. Неважно, сохраняете ли вы свои данные в сервисе -> у вас все еще есть их только в памяти. Поэтому на странице обновления вы теряете их. Итак, это вопрос: как управлять данными пользователя, чтобы сохранить их, даже если пользователь обновляет страницу? – wawka
Это был момент, если вы продолжаете работать, он не затеряется при обновлении. – Safi
Я так не думаю. Сервис хранится только в памяти. Поэтому, когда вы обновляете страницу, услугу нужно снова воссоздать. Любые данные, которые не хранятся в постоянной памяти (например, локальное хранилище, будут потеряны). Другим решением может быть снова запросить сервер о пользовательских данных. – wawka