Авторизация действий пользователя #

Васильев Андрей Михайлович, 2025

Версии презентации

Авторизация действий в приложении #

  • Клиент посылает с каждым запросом данные с помощью механизма куков или в заголовке
  • Ожидается, что в переданных данных хранится корректный JWT-токен
  • При получении запроса приложению необходимо:
    1. Извлечь JWT-токен из данных запроса
    2. Верифицировать подпись JWT-токена
    3. Извлечь идентификационные данные для JWT-токена
    4. Сформировать данные для выполнения авторизации, например выделить роль
    5. Принять решение об авторизации действия
  • Шаги № 1-4 являются общими для множества запросов, их следует расположить в фильтре для всех обработчиков, которые
  • Шаг № 5 может быть выполнен на любом уровне обработки запросов

Уровни авторизации действий #

При разработке приложений на библиотеке http4k можно выполнять:

  • На уровне фильтров
  • На уровне маршрутизатора
  • На уровне обработчика запроса
  • Внутри операции над данными

Внутри приложения стоит выбрать не более двух подходов к решению этой задачи

  • Для большинства приложений не является необходимым выполнять проверку авторизации при доступе к статическим данным
  • Не рекомендуется засорять маршрутизатор дополнительными проверками

Ролевая модель доступа #

Если мы хотим реализовать проверку прав доступа на всех уровнях приложения, то необходимо описать права в отдельной сущности

Предлагается следующий подход к моделированию прав:

  1. Определите список действий в приложении, доступ к которым должен быть ограничен
    • Просмотр списка зарегистрированных пользователей
    • Добавление и редактирование новости компании
  2. Определите список ролей внутри системы:
    • Менеджер пользователей системы
    • Редакторы сайта
    • Анонимные пользователи
  3. Сформируйте наборы прав для каждой из ролей
  4. Определите: действует ли фактор владения на возможность выполнения действий. Например редактированием сообщения может как редактор сайта, так и автор сообщения

Кодирование ролей #

Самый простой способ кодирования — использование классов данных

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()
    }
}

Внутри такого класса можно зафиксировать список действий внутри приложения и связать данные действия с конкретными ролями внутри приложения