Как фронтэнду заранее узнать о доступных действиях в бэкенде?

Приложение работает через rest. Интересует: как фронтэнду заранее можно знать (не делая запрос) доступно ли текущему пользователю действие по некоему эндпоинту? Т.е. у фронта должна быть возможность сделать проверку на доступ не делая прямой запрос. Кажется, бэк как-то должен сообщать фронту права текущего пользователя.

Если бы в бэкэнде была система управления доступом только через роли, то примерно так по моему мнению оно работало: при логине пользователя можно было бы ему отправить его роли и фротнэнд через документацию по бэкэнд api делал бы у себя проверки.

Но в нашем приложении разграничение доступа по роли не подходит, ибо права пользователей меняются от состояния системы (например, пользователя добавили в группу A, и теперь он может делать записи в блокноте, который доступен только для группы A. Притом, пользователь, например, должен занимать ещё и какую-то определенную должность в своей компании + могут быть ещё и другие проверки). Такая система доступа выглядит как abac.

Мы используем django фреймворк питона и django-rest-framework с ним. Там в контроллерах указываются permission_classes - проверки, при успешном выполнении которых доступ разрешен. Т.е. в рантайме будут проверяться права пользователя на основе проверок в коде.

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

Все тот же вопрос: как фронтэнду заранее можно знать (не делая запрос) доступно ли текущему пользователю (в системе с динамическими правами) действие по некоему эндпоинту? Думаю, большинство приложений работает по динамическим разрешениям, и явно уже сформулировано несколько решений.


Ответы (1 шт):

Автор решения: Sergey Gornostaev

Можно использовать для авторизации jwt и записать токену в claims пользовательские роли, а в код фронта захардкодить соответствие ролей правам. Или не хардкодить, а загружать один раз при загрузке фронта.

→ Ссылка