В этой статье я хочу поделиться своим опытом использования тематического разделения доступа (ТРД) для создания веб-приложения, которое позволяет пользователям обмениваться сообщениями по разным темам. ТРД — это метод управления доступом, при котором права доступа субъектов системы на объекты группируются с учётом специфики их применения, образуя роли¹. Например, в моём приложении есть роли администратора, модератора, автора и читателя. Каждая роль имеет свой набор прав на разные действия, такие как создание, редактирование, удаление и просмотр сообщений.
Архитектура приложения
Моё приложение состоит из трёх основных компонентов: фронтенда, бэкенда и базы данных. Фронтенд — это веб-интерфейс, который позволяет пользователям взаимодействовать с приложением. Бэкенд — это серверная часть, которая обрабатывает запросы от фронтенда и выполняет бизнес-логику приложения. База данных — это хранилище данных, которое содержит информацию о пользователях, ролях, сообщениях и темах.
Для реализации ТРД я использовал следующие технологии:
Фронтенд: 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».
Результаты и выводы
Используя ТРД, я смог создать веб-приложение, которое обеспечивает разграничение доступа к данным и функционалу в зависимости от роли пользователя. Это повышает безопасность и удобство использования приложения, а также упрощает его разработку и поддержку.
В этой статье я описал свой опыт использования ТРД для создания веб-приложения, которое позволяет пользователям обмениваться сообщениями по разным темам. В случае нахождения какой-либо ошибки прошу сообщить мне
Я надеюсь, что эта статья была полезна и интересна для вас. Спасибо за внимание!
