RESTful API для управления заметками с JWT аутентификацией и ролевой системой.
- Python 3.11+
- Django 4.2+
- SQLite (по умолчанию) или PostgreSQL
Система использует JSON Web Tokens (JWT) для безопасной аутентификации пользователей. JWT - это токены, которые содержат информацию о пользователе и подписываются сервером для защиты от подделки.
- Access Token - короткоживущий токен для доступа к API
- Refresh Token - долгоживущий токен для обновления access токена
В проекте реализован декоратор require_roles() для проверки прав доступа. Проверяет, имеет ли пользователь необходимые роли для доступа к конкретному endpoint'у. Или если нужна тонкая настройка доступа, используется ручная проверка ролей в бизнес-логике.
class Role(IntEnum):
ADMIN = 0 # Администратор - полный доступ, за исключением просмотра заметок других пользователей по ID
USER = 1 # Пользователь - ограниченный доступ, можно создавать / смотреть / редактировать / удалять свои заметки. А так же управлять свом профилем, за исключением установки роли. При удалении учетной записи пользователь становится неактивным
┌─────────────────────────────────────────────────────────────┐
│ Запрос пользователя │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 1. JWT Аутентификация │
│ Проверка access token через CustomJWTAuthentication │
│ • Возвращает 401 если пользователь не аутентифицирован │
│ • Устанавливает request.user при успешной аутентификации │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 2. Декоратор require_roles() │
│ • Извлекает роль пользователя из request.user.role │
│ • Проверяет required_roles декоратора │
│ • Сравнивает с role пользователя │
│ • Возвращает 403 если роль не совпадает │
└─────────────────┬───────────────────────────────────────────┘
│
▼
┌─────────────────────────────────────────────────────────────┐
│ 3. Выполнение View │
│ Доступ разрешен - выполняется бизнес-логика │
└─────────────────────────────────────────────────────────────┘Модель: apps.users.models.User
Таблица: users
Описание: Кастомная модель пользователя с поддержкой ролей и JWT аутентификации.
Поля:
id- уникальный идентификаторname- полное имя пользователяemail- email (уникальный, используется для входа)password- хешированный пароль (bcrypt)role- роль пользователя (0=ADMIN, 1=USER)is_active- активен ли аккаунтcreated_at,updated_at- временные метки
Связанные модели:
- Один-ко-многим с
Note(у пользователя много заметок)
Модель: apps.notes.models.Note
Таблица: notes
Описание: Основная сущность приложения - заметки пользователей.
Поля:
id- уникальный идентификаторname- название заметкиdescription- содержание заметкиuser- внешний ключ к User (владелец заметки)created_at,updated_at- временные метки
Связанные модели:
- Многие-к-одному с
User(принадлежит одному пользователю)
- Клонируйте репозиторий
git clone <repository-url>cd <project-directory>- Установить проект командой setup.sh (с выдачей прав)
chmod +x setup.sh./setup.sh- Альтернативный путь установить вручную
3.1. Установите зависимости с помощью Pipenv
pipenv install --dev3.2. Примените миграции базы данных
pipenv run python manage.py migrate3.3. Создайте тестовых пользователей и заметки с помощью команды python
pipenv run python manage.py create_test_data3.4. Активируйте, виртуальное окружение и запустите сервер разработки
pipenv shellpipenv run python manage.py runserver3.5. Создание супер пользователя в Django admin (если необходимо)
pipenv run python manage.py createsuperuserДля тестирования API можно импортировать файл postman_collection.json в Postman