Skip to content

NVLev/Authorization-Authentication

Repository files navigation

Custom Authentication & Authorization System

Backend-приложение с собственной системой аутентификации и авторизации на основе ролей (RBAC)

📋 Описание проекта

Система реализует гибкую модель управления доступом к ресурсам, где права пользователей определяются:

  • Ролями (admin, manager, user)
  • Ресурсами (projects, users, access_rules)
  • Правилами доступа (read, create, update, delete с разделением "все/только свои")

Основные возможности

✅ JWT-аутентификация (access + refresh токены)
✅ Гибкая система ролей и прав (RBAC)
✅ Разделение прав "свои/все объекты" (owner-based access)
✅ Soft delete пользователей (is_active=False)
✅ API для управления правами (только для admin)
✅ Mock-endpoints для демонстрации системы
✅ Полная документация API (Swagger UI)
✅ Async/await архитектура


🏗️ Архитектура системы

Схема базы данных

users ←→ user_roles ←→ roles
                         ↓
                    access_rules
                         ↓
                 business_elements
                 
users → refresh_tokens
users → projects (owner_id)

Таблицы БД

Таблица Описание
users Пользователи системы (email, pass_hash, is_active)
roles Роли (admin, manager, user)
user_roles Many-to-many связь пользователей и ролей
business_elements Ресурсы приложения (projects, users, access_rules)
access_rules Правила доступа: роль → ресурс → права
refresh_tokens JWT refresh токены для обновления сессий
projects Демо-ресурс для тестирования системы прав

Система прав доступа

Каждая роль имеет набор прав на каждый ресурс:

Право Описание
read_permission Чтение только своих объектов
read_all_permission Чтение всех объектов
create_permission Создание новых объектов
update_permission Редактирование своих объектов
update_all_permission Редактирование всех объектов
delete_permission Удаление своих объектов
delete_all_permission Удаление всех объектов

Примеры прав по ролям

Роль Ресурс: projects Описание
Admin read_all, create, update_all, delete_all Полный доступ ко всем проектам
Manager read_all, create, update (свои), delete (свои) Видит все проекты, редактирует только свои
User read (свои), create, update (свои), delete (свои) Работает только со своими проектами

🚀 Быстрый старт

Требования

  • Python 3.11+
  • Docker & Docker Compose
  • Poetry (опционально)

1. Клонирование репозитория

git clone https://github.com/NVLev/EM_Test_Task
cd EM_Test_Task

2. Установка зависимостей

С Poetry:

poetry install
poetry shell

Без Poetry:

pip install -r requirements.txt

3. Настройка окружения

Создайте файл .env на основе .env.template:

cp .env.template .env

Основные переменные в .env:

# PostgreSQL
POSTGRES_DB=auth_system
POSTGRES_USER=auth_user
POSTGRES_PASSWORD=your_secure_password

# JWT
APP_CONFIG__AUTH__SECRET_KEY=your-secret-key-here  # Сгенерируйте: openssl rand -hex 32
APP_CONFIG__AUTH__ALGORITHM=HS256
APP_CONFIG__AUTH__ACCESS_EXPIRE_MINUTES=30
APP_CONFIG__AUTH__REFRESH_EXPIRE_DAYS=7

# Database URL
APP_CONFIG__DB__URL=postgresql+asyncpg://auth_user:your_secure_password@localhost:5432/auth_system

4. Запуск PostgreSQL

docker-compose up -d

Проверка:

docker-compose ps
# Должно быть: auth_postgres (healthy)

5. Применение миграций

alembic upgrade head

6. Заполнение тестовыми данными

python seed_data.py

Будут созданы тестовые аккаунты:

  • admin@test.com / admin123 (роль: admin)
  • manager@test.com / manager123 (роль: manager)
  • user@test.com / user123 (роль: user)

7. Запуск приложения

uvicorn main:app --reload

Приложение доступно по адресу: http://localhost:8000

Swagger UI: http://localhost:8000/docs


📚 API Endpoints

🔐 Аутентификация (/auth)

Метод Endpoint Описание Доступ
POST /auth/register Регистрация нового пользователя Публичный
POST /auth/login Вход (получение токенов) Публичный
POST /auth/refresh Обновление access токена Требуется refresh token
POST /auth/logout Выход (отзыв refresh токена) Требуется refresh token
GET /auth/me Информация о текущем пользователе Требуется авторизация

👑 Администрирование (/admin)

Доступ: только admin

Метод Endpoint Описание
GET /admin/roles Список всех ролей
POST /admin/roles Создание новой роли
GET /admin/resources Список бизнес-элементов (ресурсов)
POST /admin/resources Создание нового ресурса
GET /admin/rules Список правил доступа
POST /admin/rules Создание правила доступа
PATCH /admin/rules/{id} Обновление правила доступа

📦 Демо-ресурсы (/projects)

Доступ: зависит от роли

Метод Endpoint Описание
GET /projects/ Список проектов (с учётом прав)
POST /projects/ Создание проекта
GET /projects/{id} Получение проекта
PATCH /projects/{id} Обновление проекта (только свой/все)
DELETE /projects/{id} Удаление проекта (только свой/все)

🧪 Примеры использования

1. Регистрация и вход

Регистрация:

curl -X POST http://localhost:8000/auth/register \
  -H "Content-Type: application/json" \
  -d '{"email": "newuser@test.com", "password": "password123"}'

Вход:

curl -X POST http://localhost:8000/auth/login \
  -H "Content-Type: application/json" \
  -d '{"email": "admin@test.com", "password": "admin123"}'

Ответ:

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "refresh_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer"
}

2. Работа с проектами

Создание проекта:

curl -X POST http://localhost:8000/projects/ \
  -H "Authorization: Bearer <access_token>" \
  -H "Content-Type: application/json" \
  -d '{"title": "My Project", "description": "Test project"}'

Список проектов:

curl -X GET http://localhost:8000/projects/ \
  -H "Authorization: Bearer <access_token>"

3. Управление правами (только admin)

Список правил доступа:

curl -X GET http://localhost:8000/admin/rules \
  -H "Authorization: Bearer <admin_access_token>"

🧪 Тестирование

Запуск тестов

# 1. Убедитесь, что БД заполнена
python seed_data.py --force

# 2. Запустите тесты
pytest -v

Ручное тестирование через Swagger

  1. Откройте http://localhost:8000/docs
  2. Используйте /auth/login для получения токена
  3. Нажмите кнопку 🔓 Authorize вверху справа
  4. Вставьте access_token
  5. Тестируйте endpoints с разными ролями!

🛠️ Технологии

Технология Назначение
FastAPI Веб-фреймворк
SQLAlchemy 2.0 ORM (async)
Alembic Миграции базы данных
PostgreSQL Реляционная БД
asyncpg Async драйвер для PostgreSQL
Pydantic Валидация данных
python-jose JWT токены
bcrypt Хеширование паролей
pytest Тестирование
Docker Контейнеризация

📁 Структура проекта

EM_Test_Task/
├── core/                   # Ядро приложения
│   ├── config.py          # Настройки из .env
│   ├── db_helper.py       # Управление БД сессиями
│   ├── models.py          # SQLAlchemy модели
│   └── schemas.py         # Pydantic схемы
├── services/              # Бизнес-логика
│   ├── auth_service.py    # Аутентификация (JWT, пароли)
│   └── authz_service.py   # Авторизация (проверка прав)
├── routes/                # API endpoints
│   ├── auth.py            # /auth/* (регистрация, логин)
│   ├── admin.py           # /admin/* (управление правами)
│   └── mock_resources.py  # /projects/* (демонстрация)
├── middleware/            # Промежуточные слои
│   └── permissions.py     # Проверка прав доступа
├── tests/                 # Тесты
│   ├── conftest.py        # Фикстуры pytest
│   ├── test_auth.py       # Тесты аутентификации
│   ├── test_authz.py      # Тесты авторизации
│   └── test_admin.py      # Тесты admin API
├── alembic/               # Миграции БД
├── main.py                # Точка входа FastAPI
├── seed_data.py           # Заполнение тестовыми данными
├── docker-compose.yml     # Docker конфигурация
├── pyproject.toml         # Зависимости (Poetry)
└── README.md              # Документация

🔒 Безопасность

  • ✅ Пароли хешируются через bcrypt
  • ✅ JWT токены с истечением срока действия
  • ✅ Refresh токены хранятся в БД с возможностью отзыва
  • ✅ Проверка прав доступа на уровне middleware
  • ✅ Soft delete пользователей (не удаляем из БД)

📝 Дополнительные команды

Работа с БД

# Пересоздать тестовые данные
python seed_data.py --force

# Очистить БД
python seed_data.py --clear

# Создать новую миграцию
alembic revision --autogenerate -m "Description"

# Откатить миграцию
alembic downgrade -1

Работа с Docker

# Перезапустить БД
docker-compose restart

# Посмотреть логи
docker-compose logs -f pg

# Подключиться к БД
docker exec -it auth_postgres psql -U auth_user -d auth_system

🎓 Что реализовано

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

  • Регистрация (email, пароль)
  • Login/Logout
  • Обновление профиля (/auth/me)
  • Мягкое удаление (is_active=False)

2. Система разграничения прав доступа

  • Таблицы: roles, business_elements, access_rules
  • Гибкая система прав (read/create/update/delete)
  • Разделение "все/только свои" объекты
  • API для управления правилами (admin)

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

  • /projects/* endpoints
  • Проверка прав доступа
  • Возврат 401/403 при отсутствии прав

Дополнительно реализовано:

✅ Refresh токены (JWT)
✅ Swagger UI документация
✅ Async/await архитектура
✅ Docker окружение
✅ Тесты (pytest)


👨‍💻 Автор

Наталья Левант


📄 Лицензия

MIT License

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages