Skip to content

DeStep3000/test_pythondev

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

30 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Backend система аутентификации и авторизации

📌 Описание

Данное 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 — для доступа к API
    • refresh_token — для управления сессией
  • Logout реализован через revocation refresh-сессии, а не просто удаление токена на клиенте.
  • Каждая сессия хранится в БД и может быть отозвана.

Поток аутентификации

  1. Пользователь логинится по email и паролю
  2. Сервер выдаёт JWT
  3. Клиент передаёт Authorization: Bearer <token>
  4. При каждом запросе пользователь идентифицируется сервером

👤 Взаимодействие с пользователем

Реализованы следующие функции:

Регистрация

  • Ввод:
    • фамилии, имени, отчества
    • email
    • пароль и повтор пароля
  • Email уникален
  • Пароль хэшируется (PBKDF2 + salt)

Login

  • Вход по email и паролю
  • Возвращается access_token и refresh_token

Logout

  • Текущая сессия помечается как отозванная
  • Access-токен становится недействительным

Обновление профиля

  • Пользователь может редактировать свои данные

Удаление пользователя (мягкое)

  • Пользователь инициирует удаление аккаунта
  • Происходит logout
  • В БД пользователь остаётся, но:
    • is_active = False
  • Повторный логин невозможен

🔑 Авторизация и разграничение прав доступа

Авторизация реализована на основе собственной RBAC-модели с правилами доступа.

Используемая модель доступа

Основные сущности БД:

  • User — пользователь
  • Role — роль пользователя
  • Resource — защищаемый ресурс
  • Action — действие над ресурсом (read, create, update, delete)
  • Permission — комбинация resource + action
  • UserRole — связь пользователя и роли
  • RolePermission — связь роли и разрешений
  • AccessRule — правило доступа (allow / deny)

Логика проверки доступа

  1. Если пользователь не аутентифицирован401 Unauthorized
  2. Если пользователь определён, но не имеет прав403 Forbidden
  3. Если доступ разрешён → ресурс возвращается

Правила deny имеют больший приоритет, чем allow.


🛡 Административное API

Пользователь с ролью admin имеет доступ к API управления правилами доступа:

  • получение текущих правил
  • изменение разрешений

Обычные пользователи не имеют доступа к этим эндпоинтам.


🧩 Mock-объекты бизнес-приложения

Для демонстрации работы системы реализованы 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

docker compose up --build

После запуска:

  • API доступно по адресу: http://localhost:8000
  • Postgres запускается автоматически
  • Миграции и seed выполняются автоматически

📎 Итог

В рамках задания реализована:

  • собственная система аутентификации
  • собственная система авторизации
  • продуманная схема доступа к ресурсам
  • корректная обработка 401 / 403
  • демонстрационные бизнес-ресурсы

Решение демонстрирует понимание различий между:

  • аутентификацией и авторизацией,
  • stateless JWT и серверными сессиями,
  • управлением доступом на уровне бизнес-логики.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors