Данное backend-приложение реализует собственную систему аутентификации и авторизации, не основанную полностью на стандартных механизмах фреймворка «из коробки».
Основной акцент сделан на:
- разделении аутентификации (идентификация пользователя),
- и авторизации (проверка прав доступа к ресурсам),
- проектировании собственной модели доступа к ресурсам,
- корректной обработке HTTP-ошибок 401 / 403.
Приложение реализовано как REST API и может использоваться как backend для SPA или другого клиентского приложения.
- Python 3.11+
- Django
- Django REST Framework
- PostgreSQL
- JWT (JSON Web Token) — собственная реализация
- Docker / Docker Compose
Аутентификация реализована самостоятельно, без использования стандартных механизмов Django (django.contrib.auth).
- Аутентификация основана на JWT:
access_token— для доступа к APIrefresh_token— для управления сессией
- Logout реализован через revocation refresh-сессии, а не просто удаление токена на клиенте.
- Каждая сессия хранится в БД и может быть отозвана.
- Пользователь логинится по email и паролю
- Сервер выдаёт JWT
- Клиент передаёт
Authorization: Bearer <token> - При каждом запросе пользователь идентифицируется сервером
Реализованы следующие функции:
- Ввод:
- фамилии, имени, отчества
- пароль и повтор пароля
- Email уникален
- Пароль хэшируется (PBKDF2 + salt)
- Вход по email и паролю
- Возвращается
access_tokenиrefresh_token
- Текущая сессия помечается как отозванная
- Access-токен становится недействительным
- Пользователь может редактировать свои данные
- Пользователь инициирует удаление аккаунта
- Происходит logout
- В БД пользователь остаётся, но:
is_active = False
- Повторный логин невозможен
Авторизация реализована на основе собственной RBAC-модели с правилами доступа.
- User — пользователь
- Role — роль пользователя
- Resource — защищаемый ресурс
- Action — действие над ресурсом (read, create, update, delete)
- Permission — комбинация
resource + action - UserRole — связь пользователя и роли
- RolePermission — связь роли и разрешений
- AccessRule — правило доступа (allow / deny)
- Если пользователь не аутентифицирован →
401 Unauthorized - Если пользователь определён, но не имеет прав →
403 Forbidden - Если доступ разрешён → ресурс возвращается
Правила deny имеют больший приоритет, чем allow.
Пользователь с ролью admin имеет доступ к API управления правилами доступа:
- получение текущих правил
- изменение разрешений
Обычные пользователи не имеют доступа к этим эндпоинтам.
Для демонстрации работы системы реализованы mock-views (без создания таблиц в БД):
/api/mock/reports/api/mock/documents
Они:
- возвращают данные при наличии прав
- возвращают 401 или 403 в зависимости от ситуации
Это позволяет продемонстрировать работу системы авторизации без реализации реальной бизнес-логики.
| Ситуация | HTTP-код |
|---|---|
| Пользователь не аутентифицирован | 401 Unauthorized |
| Пользователь аутентифицирован, но нет прав | 403 Forbidden |
| Неверные данные | 400 Bad Request |
Для демонстрации работы системы реализована команда:
python manage.py seed_demoОна создаёт:
- роли
admin,user - базовые permissions
- тестовых пользователей:
admin@example.com / Admin12345!user@example.com / User12345!
docker compose up --buildПосле запуска:
- API доступно по адресу:
http://localhost:8000 - Postgres запускается автоматически
- Миграции и seed выполняются автоматически
В рамках задания реализована:
- собственная система аутентификации
- собственная система авторизации
- продуманная схема доступа к ресурсам
- корректная обработка 401 / 403
- демонстрационные бизнес-ресурсы
Решение демонстрирует понимание различий между:
- аутентификацией и авторизацией,
- stateless JWT и серверными сессиями,
- управлением доступом на уровне бизнес-логики.