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