Авторизация действий пользователя #
Васильев Андрей Михайлович, 2025
Версии презентации
Авторизация действий в приложении #
- Клиент посылает с каждым запросом данные с помощью механизма куков или в заголовке
- Ожидается, что в переданных данных хранится корректный JWT-токен
- При получении запроса приложению необходимо:
- Извлечь JWT-токен из данных запроса
- Верифицировать подпись JWT-токена
- Извлечь идентификационные данные для JWT-токена
- Сформировать данные для выполнения авторизации, например выделить роль
- Принять решение об авторизации действия
- Шаги № 1-4 являются общими для множества запросов, их следует расположить в фильтре для всех обработчиков, которые
- Шаг № 5 может быть выполнен на любом уровне обработки запросов
Уровни авторизации действий #
При разработке приложений на библиотеке http4k можно выполнять:
- На уровне фильтров
- На уровне маршрутизатора
- На уровне обработчика запроса
- Внутри операции над данными
Внутри приложения стоит выбрать не более двух подходов к решению этой задачи
- Для большинства приложений не является необходимым выполнять проверку авторизации при доступе к статическим данным
- Не рекомендуется засорять маршрутизатор дополнительными проверками
Ролевая модель доступа #
Если мы хотим реализовать проверку прав доступа на всех уровнях приложения, то необходимо описать права в отдельной сущности
Предлагается следующий подход к моделированию прав:
- Определите список действий в приложении, доступ к которым должен быть ограничен
- Просмотр списка зарегистрированных пользователей
- Добавление и редактирование новости компании
- Определите список ролей внутри системы:
- Менеджер пользователей системы
- Редакторы сайта
- Анонимные пользователи
- Сформируйте наборы прав для каждой из ролей
- Определите: действует ли фактор владения на возможность выполнения действий. Например редактированием сообщения может как редактор сайта, так и автор сообщения
Кодирование ролей #
Самый простой способ кодирования — использование классов данных
data class Permissions(
val manageUsers: Boolean = false,
val manageNews: Boolean = false,
) {
companion object {
val USER_EDITOR = Permissions(manageUsers = true)
val NEWS_EDITOR = Permissions(manageNews = true)
val ANONIMOUS = Permissions()
}
}
Внутри такого класса можно зафиксировать список действий внутри приложения и связать данные действия с конкретными ролями внутри приложения