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 (опционально)
git clone https://github.com/NVLev/EM_Test_Task
cd EM_Test_TaskС Poetry:
poetry install
poetry shellБез Poetry:
pip install -r requirements.txtСоздайте файл .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_systemdocker-compose up -dПроверка:
docker-compose ps
# Должно быть: auth_postgres (healthy)alembic upgrade headpython seed_data.pyБудут созданы тестовые аккаунты:
admin@test.com/admin123(роль: admin)manager@test.com/manager123(роль: manager)user@test.com/user123(роль: user)
uvicorn main:app --reloadПриложение доступно по адресу: http://localhost:8000
Swagger UI: http://localhost:8000/docs
| Метод | Endpoint | Описание | Доступ |
|---|---|---|---|
| POST | /auth/register |
Регистрация нового пользователя | Публичный |
| POST | /auth/login |
Вход (получение токенов) | Публичный |
| POST | /auth/refresh |
Обновление access токена | Требуется refresh token |
| POST | /auth/logout |
Выход (отзыв refresh токена) | Требуется refresh token |
| GET | /auth/me |
Информация о текущем пользователе | Требуется авторизация |
Доступ: только admin
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /admin/roles |
Список всех ролей |
| POST | /admin/roles |
Создание новой роли |
| GET | /admin/resources |
Список бизнес-элементов (ресурсов) |
| POST | /admin/resources |
Создание нового ресурса |
| GET | /admin/rules |
Список правил доступа |
| POST | /admin/rules |
Создание правила доступа |
| PATCH | /admin/rules/{id} |
Обновление правила доступа |
Доступ: зависит от роли
| Метод | Endpoint | Описание |
|---|---|---|
| GET | /projects/ |
Список проектов (с учётом прав) |
| POST | /projects/ |
Создание проекта |
| GET | /projects/{id} |
Получение проекта |
| PATCH | /projects/{id} |
Обновление проекта (только свой/все) |
| DELETE | /projects/{id} |
Удаление проекта (только свой/все) |
Регистрация:
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"
}Создание проекта:
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>"Список правил доступа:
curl -X GET http://localhost:8000/admin/rules \
-H "Authorization: Bearer <admin_access_token>"# 1. Убедитесь, что БД заполнена
python seed_data.py --force
# 2. Запустите тесты
pytest -v- Откройте http://localhost:8000/docs
- Используйте
/auth/loginдля получения токена - Нажмите кнопку 🔓 Authorize вверху справа
- Вставьте
access_token - Тестируйте 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-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