Javascript-форум (https://javascript.ru/forum/)
-   Библиотеки/Тулкиты/Фреймворки (https://javascript.ru/forum/library-toolkit-framework/)
-   -   React и контент в зависимости от типа пользователя (https://javascript.ru/forum/library-toolkit-framework/65981-react-i-kontent-v-zavisimosti-ot-tipa-polzovatelya.html)

hound 18.11.2016 22:33

React и контент в зависимости от типа пользователя
 
Добрый день, начал изучать react+redux, появился такой вопрос:
Есть некий сайт в котором может быть несколько типов пользователей (админ, менеджер и т.п) и в зависимости от типа авторизованного пользователя ему должны быть доступны разные элементы в интерфейсе.
Если с выдачей информации по API довольно просто - на сервере проверяем тип пользователя и если он не тот который нужен, то шлем ошибку. А вот как быть, если например у нас есть компонент со статьей и если тип юзера - админ, то будет доступна кнопка "удалить", а если менеджер то нет?
Хранить тип юзера в сторе редакса? не вариант, можно ее поменять через консоль - дыра.
До рендера этого компонента делать запрос на сервер с текущими куками и получать типа пользователя и уже после получения ответа рендерить компонент?
Сервер на Django, но думаю, что особой разницы какой бэк использовать тут нет.

Царь Леонид 19.11.2016 08:41

Дыра будет вне зависимости от того, что у вас там на клиенте будет. Для проверки полномочий юзера используются токены на сервере. Грубо говоря, если у вас даже не будет пресловутой кнопки удалить, что мешает злоумышленнику просто сделать запрос на удаление из консоли. Реакт - это не универсальное средство, он нужен для облегчения построения интерфейса, а не непробиваемой защиты

hound 19.11.2016 12:31

Цитата:

Сообщение от Царь Леонид (Сообщение 435465)
Дыра будет вне зависимости от того, что у вас там на клиенте будет. Для проверки полномочий юзера используются токены на сервере. Грубо говоря, если у вас даже не будет пресловутой кнопки удалить, что мешает злоумышленнику просто сделать запрос на удаление из консоли. Реакт - это не универсальное средство, он нужен для облегчения построения интерфейса, а не непробиваемой защиты

Это понятно, поэтому на сервере тоже будет проверка производиться а любом случае. В данном случае вопрос про отображение. На сколько правильный будет способ - до рендера компонента, скажем в методе componentDidMount делать запрос на сервер о том, что выводить эту кнопку или нет?

destus 19.11.2016 14:13

hound,
Цитата:

до рендера компонента, скажем в методе componentDidMount делать запрос на сервер о том, что выводить эту кнопку или нет?
А если таких кнопок 10? 10 запросов?

JWT токены генерируются сервером и сохраняются на клиенте в каком-нибудь хранилище: куки, localStorage, sessionStorage. При инициализации нашего приложения происходит проверка существования токена, и если он есть -- посылается запрос на сервер для проверки его валидности по секретному ключу. Желательно ещё проверять нет ли этого токена в списке запрещенных: истекает срок действия, пользователь заблокирован и т.д.. Более подробно тут https://medium.com/@rajaraodv/securi...ea0#.byuolbn66 и пример https://github.com/joshgeller/react-...t-auth-example

Царь Леонид 19.11.2016 15:57

Цитата:

Сообщение от hound (Сообщение 435476)
Это понятно, поэтому на сервере тоже будет проверка производиться а любом случае. В данном случае вопрос про отображение. На сколько правильный будет способ - до рендера компонента, скажем в методе componentDidMount делать запрос на сервер о том, что выводить эту кнопку или нет?

Роль пользователя надо хранить в глобальном store и уже в зависимости от этого выводить кнопку или нет. В этом же вся соль редакса

hound 19.11.2016 16:09

Цитата:

Сообщение от Царь Леонид (Сообщение 435499)
Роль пользователя надо хранить в глобальном store и уже в зависимости от этого выводить кнопку или нет. В этом же вся соль редакса

Да, но это значение можно поменять. Хотя, в любом случае проверка на сервере есть.

hound 19.11.2016 16:09

Цитата:

Сообщение от destus (Сообщение 435482)
hound,

А если таких кнопок 10? 10 запросов?

JWT токены генерируются сервером и сохраняются на клиенте в каком-нибудь хранилище: куки, localStorage, sessionStorage. При инициализации нашего приложения происходит проверка существования токена, и если он есть -- посылается запрос на сервер для проверки его валидности по секретному ключу. Желательно ещё проверять нет ли этого токена в списке запрещенных: истекает срок действия, пользователь заблокирован и т.д.. Более подробно тут https://medium.com/@rajaraodv/securi...ea0#.byuolbn66 и пример https://github.com/joshgeller/react-...t-auth-example

спасибо, покурю маны

hound 19.11.2016 16:55

Цитата:

Сообщение от destus (Сообщение 435482)
hound,

А если таких кнопок 10? 10 запросов?

JWT токены генерируются сервером и сохраняются на клиенте в каком-нибудь хранилище: куки, localStorage, sessionStorage. При инициализации нашего приложения происходит проверка существования токена, и если он есть -- посылается запрос на сервер для проверки его валидности по секретному ключу. Желательно ещё проверять нет ли этого токена в списке запрещенных: истекает срок действия, пользователь заблокирован и т.д.. Более подробно тут https://medium.com/@rajaraodv/securi...ea0#.byuolbn66 и пример https://github.com/joshgeller/react-...t-auth-example

А в чем именно преимущество JWT перед session? По личному опыту.

destus 19.11.2016 21:03

Цитата:

А в чем именно преимущество JWT перед session? По личному опыту.
В том, что это SPA. Сервер просто предоставляет какое-то апи, которое может использоваться на разных клиентах (браузер, мобильное устройство и т.д.). Апи -- stateless, оно нигде не хранит состояние, БД не выступает в роли хранилища сессий юзера. Токены хранятся на клиенте.


Часовой пояс GMT +3, время: 14:57.