В этой статье я хочу поделиться своим опытом использования тематического разделения доступа (ТРД) для создания веб-приложения, которое позволяет пользователям обмениваться сообщениями по разным темам. ТРД — это метод управления доступом, при котором права доступа субъектов системы на объекты группируются с учётом специфики их применения, образуя роли¹. Например, в моём приложении есть роли администратора, модератора, автора и читателя. Каждая роль имеет свой набор прав на разные действия, такие как создание, редактирование, удаление и просмотр сообщений.

Архитектура приложения

Моё приложение состоит из трёх основных компонентов: фронтенда, бэкенда и базы данных. Фронтенд — это веб-интерфейс, который позволяет пользователям взаимодействовать с приложением. Бэкенд — это серверная часть, которая обрабатывает запросы от фронтенда и выполняет бизнес-логику приложения. База данных — это хранилище данных, которое содержит информацию о пользователях, ролях, сообщениях и темах.

Для реализации ТРД я использовал следующие технологии:

  • Фронтенд: React.js — библиотека для создания пользовательских интерфейсов².

  • Бэкенд: Node.js — платформа для создания серверных приложений на JavaScript³.

  • База данных: MongoDB — документоориентированная система управления базами данных.

 Модель данных

В моей базе данных я использовал следующие коллекции:

  • users: содержит данные о пользователях, такие как имя, пароль, email и роль.

  • roles: содержит данные о ролях, такие как название, описание и права доступа.

  • topics: содержит данные о темах, такие как название, описание и список сообщений.

  • messages: содержит данные о сообщениях, такие как текст, автор, дата и тема.

Пример документа из коллекции users:


{
  "_id": "60f9a7c8b5f4c32a4f6d8e9d",
  "name": "Alice",
  "password": "hashed_password",
  "email": "alice@example.com",
  "role": "author"
}

Пример документа из коллекции roles:

{
  "_id": "60f9a7d0b5f4c32a4f6d8e9e",
  "name": "author",
  "description": "A user who can create and edit their own messages",
  "permissions": {
    "createMessage": true,
    "editMessage": true,
    "deleteMessage": false,
    "viewMessage": true
  }
}

Пример документа из коллекции topics:

{
  "_id": "60f9a7dab5f4c32a4f6d8e9f",
  "name": "Sports",
  "description": "A topic for discussing sports news and events",
  "messages": [
    {
      "_id": "60f9a7e4b5f4c32a4f6d8ea0",
      "text": "Who will win the World Cup?",
      "author": {
        "_id": "60f9a7c8b5f4c32a4f6d8e9d",
        "name": "Alice"
      },
      "date": "2023-10-13T08:19:51.000Z",
      "topic": {
        "_id": "60f9a7dab5f4c32a4f6d8e9f",
        "name": "Sports"
      }
    },
    {
      "_id": "60f9a7eeb5f4c32a4f6d8ea1",
      "text": "I think Brazil will win",
      "author": {
        "_id": "60f9a7ccb5f4c32a4f6d8e9c",
        "name": "Bob"
      },
      "date": "2023-10-13T08:20:14.000Z",
      "topic": {
        "_id": "60f9a7dab5f4c32a4f6d8e9f",
        "name": "Sports"
      }
    }
  ]
}

Пример документа из коллекции messages:

{
  "_id": "60f9a7e4b5f4c32a4f6d8ea0",
  "text": "Who will win the World Cup?",
  "author": {
    "_id": "60f9a7c8b5f4c32a4f6d8e9d",
    "name": "Alice"
  },
  "date": "2023-10-13T08:19:51.000Z",
  "topic": {
    "_id": "60f9a7dab5f4c32a4f6d8e9f",
    "name": "Sports"
  }
}

Логика приложения

В моём приложении я использовал следующие основные функции:

  • register: позволяет пользователю зарегистрироваться в приложении, указав имя, пароль, email и роль. При регистрации пароль хешируется и сохраняется в базе данных вместе с другими данными пользователя.

  • login: позволяет пользователю войти в приложение, указав имя и пароль. При входе пароль сравнивается с хешем из базы данных и, если они совпадают, пользователю выдаётся токен аутентификации, который он должен использовать для последующих запросов.

  • logout: позволяет пользователю выйти из приложения, удаляя токен аутентификации.

  • getTopics: позволяет пользователю получить список всех тем в приложении.

  • getTopic: позволяет пользователю получить детали одной темы по её идентификатору, включая список сообщений.

  • createTopic: позволяет пользователю создать новую тему, указав название и описание. Эта функция доступна только для пользователей с ролью администратора.

  • editTopic: позволяет пользователю редактировать существующую тему по её идентификатору, изменяя название или описание. Эта функция доступна только для пользователей с ролью администратора.

  • deleteTopic: позволяет пользователю удалить существующую тему по её идентификатору, а также все сообщения, связанные с ней. Эта функция доступна только для пользователей с ролью администратора.

  • createMessage: позволяет пользователю создать новое сообщение в определённой теме, указав текст. Эта функция доступна для пользователей с ролью автора или выше.

  • editMessage: позволяет пользователю редактировать своё существующее сообщение по его идентификатору, изменяя текст. Эта функция доступна для пользователей с ролью автора или выше, но только для своих сообщений.

  • deleteMessage: позволяет пользователю удалить своё существующее сообщение по его идентификатору. Эта функция доступна для пользователей с ролью автора или выше, но только для своих сообщений

  • deleteMessage: позволяет пользователю удалить своё существующее сообщение по его идентификатору. Эта функция доступна для пользователей с ролью автора или выше, но только для своих сообщений.

  • viewMessage: позволяет пользователю просмотреть существующее сообщение по его идентификатору. Эта функция доступна для всех пользователей, но они могут видеть только сообщения из тем, к которым у них есть доступ.

Реализация ТРД

Для реализации ТРД я использовал следующие шаги:

  • Шаг 1: Определение ролей и прав доступа. Я определил четыре роли: администратор, модератор, автор и читатель. Каждая роль имеет свой набор прав на разные действия, которые я описал выше. Я также определил иерархию ролей, при которой более высокая роль наследует все права более низкой роли. Например, администратор имеет все права модератора, автора и читателя.

  • Шаг 2: Присвоение ролей пользователям. Я присвоил каждому пользователю одну роль при регистрации в приложении. Я также дал возможность администратору менять роли других пользователей по их идентификаторам.

  • Шаг 3: Проверка прав доступа при выполнении действий. Я проверял права доступа пользователя при каждом запросе к бэкенду, используя токен аутентификации и данные из базы данных. Если у пользователя есть право на выполнение запрашиваемого действия, то я выполнял его и возвращал соответствующий ответ. Если у пользователя нет права на выполнение запрашиваемого действия, то я возвращал ошибку с кодом 403 (Forbidden) и сообщением «You are not authorized to perform this action».

Результаты и выводы

Используя ТРД, я смог создать веб-приложение, которое обеспечивает разграничение доступа к данным и функционалу в зависимости от роли пользователя. Это повышает безопасность и удобство использования приложения, а также упрощает его разработку и поддержку.

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

Я надеюсь, что эта статья была полезна и интересна для вас. Спасибо за внимание!

Комментарии (4)


  1. XodzichaLatte07
    14.10.2023 11:47
    -2

    Спасибо большое, как раз искала статью по тематическому разделению доступа. Вы очень помогли!


  1. delphinpro
    14.10.2023 11:47

    RBAC (контроль доступа на основе ролей) это всегда называлось. Первый раз вижу определение "тематическое разделение доступа".


  1. Nexus94
    14.10.2023 11:47
    +1

    тематического разделения доступа (ТРД)

    Это Вы сами придумали название? Пробовал гуглить, но кроме этой статьи ничего не нашел.

    Чем Ваш ТРД отличается от RBAC - role-based access control?


    1. KOKNIWEX Автор
      14.10.2023 11:47

      На самом деле действительно этот метод, конкретно в моей работе мало чем отличается от RBAC, потому что сама система маленькая, такое разделение действительно есть, о нем узнал из учебного пособия С.С. Куликов МОДЕЛИ БЕЗОПАСНОСТИ КОМПЬЮТЕРНЫХ СИСТЕМ, если интересно можете найти в интернете, на стр 98 начинается тема про тематическое разделение доступа