JavaScript фреймфорк + права пользователей + интерфейс

Есть backbone.js или angular.js, или какая-либо похожая неведомая хрень. На бэкенде есть express.js. На выходе получаем одностраничное приложение, которое работает без перезагрузки.

Пользователь авторизуется и получает роль, допустим "пользователь обыкновенный". Он имеет на сайте определенные права, от которых зависит интерфейс: дополнительные кнопки, функции и т.д.
В какой-то момент, пока пользователь на сайте, админ дает ему другую роль, допустим "пользователь привилегированный". В этот момент у пользователя должны появиться новые функции, кнопки и другие элементы интерфейса.

Судя по всему нам нужно уведомить пользователя, можно использовать socket.io, а на клиенте сделать обработчик события, который в свою очередь будет добавлять нужные элементы интерфейса.
Так вот, верно ли я мыслю?

И второй вопрос: все эти элементы интерфейса хранить постоянно на странице и показывать/прятать при смене ролей пользователя или же изменять dom каждый раз?
  • Вопрос задан
  • 3538 просмотров
Решения вопроса 2
maxfarseer
@maxfarseer
https://maxpfrontend.ru, обучаю реакту и компании
Прослушивать событие change у модельки. Админ дает новые права (читай - сетит новые данные в модель), триггер change срабатывает и твое представление рендерит новый шаблон, где уже есть все эти кнопочки привелегированного юзера. (это на бэкбоне, на ангуляре думаю как-то похоже)
Ответ написан
Мыслете вроде верно. Тоже сейчас делаю такое приложение на AngularJS + Spring. На клиенте хранится объект авторизации с некоторыми данными пользователя (имя, роли) - в специальной службе. Так же, как и на сервере. Этот объект запрашивается один раз и обновляется по мере надобности (после редактирования профиля, например).

Но вот заморачиваться с обновлением прав, если администратор их поменял, я пока не стал. Роли пользователя остаются в силе на всё время действия авторизации. Нужно ведь обновлять авторизацию как на клиенте, так и на сервере, а потому нужно на сервере держать список всех авторизованных пользователей... ну его.

Но если сильно надо - то есть альтернатива socket.io и веб-сокетам. Можно обновление данных авторизации передавать вместе с обычными ответами сервера. Например, в HTTP-заголовках. При этом в AngularJS можно перехватывать все ответы, и, если такой заголовок найден, менять данные авторизации на клиенте. На стороне сервера передачу таких заголовков можно выполнять с помощью специального фильтра, чтобы не заморачиваться с каждым отдельным запросом...
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
Antelle
@Antelle
Ну да, так и делается. Если совсем различаются - в разные шаблоны, если не очень - скрыть контрол с ng-show или ng-if.
Бывают ещё случаи, когда у администратора интерфейс весит раз в 10 больше и грузится дольше. Или не хочется, чтобы обычный пользователь мог бы получить к ним доступ. Тогда можно ещё шаблоны и скрипты админского интерфейса отдавать отдельно, когда у пользователя есть такая роль.
Ответ написан
Комментировать
AMar4enko
@AMar4enko
Если поразмыслить, то мало скрывать-показывать элементы - для этого можно использовать, как вы правильно сказали, rootScope + директивы (ng-if, ng-hide).
Нужно еще ведь и отдачу данных ограничить - обычный пользователь не должен получать от сервера данные, которые не может видеть.
Т.е. недостаточно, на мой взгляд, просто скрыть колонку в таблице, если данные для этой колонки все равно прилетают с сервера.
Ответ написан
madmages
@madmages
Человек прямоходящий
Чтобы асинхронно получить данные то нужно либо сокет использовать либо long poling(в кратце это такой способ общения с сервером когда клиент даёт гет-пост запрос на сервер но сервер отвечает не сразу а отдаёт данные как только они появляются). Что то из этого тебе должно помочь.
И второе, а что тебе мешает изменить dom каждый раз ? Если ничего то каждый раз и меняй.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы