Skip to content

farid45/test_task_Effective_Mobile

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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

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

Собственная система разграничения прав доступа, не использующая встроенные механизмы Django (Permission, Group). Реализована на основе ролевой модели доступа (RBAC) с кастомными связями.


Схема управления ограничениями доступа

Концепция

Система построена на трёх ключевых сущностях:

  1. Ресурс (Resource) — объект системы, к которому требуется доступ
  2. Действие (Action) — операция, которую можно выполнить над ресурсом
  3. Роль (Role) — набор прав (связок Ресурс-Действие)

Пользователь получает доступ к ресурсам только через назначенные ему роли.

Пример заполнения данными

Таблица Resource

id name
1 documents
2 reports
3 permissions

Таблица Action

id name
1 view
2 manage

Таблица Role

id name
1 Admin
2 User

Таблица Permission

id role_id resource_id action_id
1 1 1 1
2 1 2 1
3 1 3 2
4 2 1 1

Расшифровка прав:

  • Admin может:
    • viewdocuments
    • viewreports
    • managepermissions
  • User может:
    • viewdocuments

Таблица UserRole

id user_id role_id
1 1 1
2 2 2

Расшифровка назначения ролей:

  • admin@test.com (user_id=1) → роль Admin
  • user@test.com (user_id=2) → роль User

Правила доступа к эндпоинтам

Метод URL Требуемое право Пример доступа
POST /api/register/ Нет (AllowAny) Всегда доступно
POST /api/login/ Нет (AllowAny) Всегда доступно
POST /api/logout/ Аутентификация Любой авторизованный
GET /api/profile/ Аутентификация Любой авторизованный
PUT /api/profile/ Аутентификация Только свой профиль
DELETE /api/profile/ Аутентификация Только свой профиль
GET /api/documents/ view на documents Admin ✓, User ✓
GET /api/reports/ view на reports Admin ✓, User ✗ (403)
GET /api/admin/roles/ manage на permissions Admin ✓, User ✗ (403)

Инструкция по проверке функционала

1. Подготовка окружения

Установка и запуск

1.1 Клонировать/создать проект

cd test_task_Effective_Mobile

1.2 Создать виртуальное окружение

python -m venv .venv
source .venv/bin/activate  # для Mac/Linux

или

.venv\Scripts\activate     # для Windows

1.3 Установить зависимости

pip install -r requirements.txt

1.4 Применить миграции

python manage.py makemigrations accounts
python manage.py migrate

1.5 Загрузить тестовые данные

python fill_data.py

1.6 Запустить сервер

python manage.py runserver

2. Проверка функционала

2.1 Регистрация нового пользователя

Запрос:

curl -X POST http://127.0.0.1:8000/api/register/ \
  -H "Content-Type: application/json" \
  -d '{
    "email": "newuser@test.com",
    "first_name": "New",
    "last_name": "User",
    "password": "newpass123",
    "password2": "newpass123"
  }'

Ожидаемый ответ:

{
  "id": 3,
  "email": "newuser@test.com",
  "message": "Регистрация успешна"
}

Статус: 201 Created

Проверка ошибки (пароли не совпадают):

curl -X POST http://127.0.0.1:8000/api/register/ \
  -H "Content-Type: application/json" \
  -d '{
    "email": "test2@test.com",
    "first_name": "Test",
    "last_name": "User",
    "password": "pass1",
    "password2": "pass2"
  }'

Ожидаемый ответ:

{"password": ["Пароли не совпадают"]} (400 Bad Request)

2.2 Вход в систему (Login)

Вход как обычный пользователь

curl -X POST http://127.0.0.1:8000/api/login/ \
  -H "Content-Type: application/json" \
  -d '{"email": "user@test.com", "password": "user123"}' \
  -c cookies_user.txt

Ожидаемый ответ:

{
  "message": "Вход выполнен",
  "email": "user@test.com"
}

Статус: 200 OK

Вход как администратор

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

Ожидаемый ответ:

{
  "message": "Вход выполнен",
  "email": "admin@test.com"
}

Проверка ошибки (неверный пароль)

curl -X POST http://127.0.0.1:8000/api/login/ \
  -H "Content-Type: application/json" \
  -d '{"email": "user@test.com", "password": "wrongpass"}'

Ожидаемый ответ:

{"error": "Неверный email или пароль"} (401 Unauthorized)

2.3 Профиль пользователя

Получение профиля

curl -X GET http://127.0.0.1:8000/api/profile/ \
  -b cookies_user.txt

Ожидаемый ответ:

{
  "id": 2,
  "email": "user@test.com",
  "first_name": "Simple",
  "last_name": "Userov",
  "is_active": true
}

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

CSRF=$(grep csrftoken cookies_user.txt | cut -f7)
curl -X PUT http://127.0.0.1:8000/api/profile/ \
  -H "Content-Type: application/json" \
  -H "X-CSRFToken: $CSRF" \
  -b cookies_user.txt \
  -d '{"first_name": "Updated", "last_name": "Name"}'

Ожидаемый ответ:

{
  "id": 2,
  "email": "user@test.com",
  "first_name": "Updated",
  "last_name": "Name",
  "is_active": true
}

2.4 Доступ к бизнес-ресурсам

Доступ к документам (должен быть у user)

curl -X GET http://127.0.0.1:8000/api/documents/ \
  -b cookies_user.txt

Ожидаемый ответ:

{
  "documents": [
    {"id": 1, "name": "Договор аренды.pdf"},
    {"id": 2, "name": "Отчёт за март.xlsx"}
  ]
}

Статус: 200 OK

Доступ к отчётам (НЕ должен быть у user)

curl -X GET http://127.0.0.1:8000/api/reports/ \
  -b cookies_user.txt

Ожидаемый ответ:

{
  "detail": "У вас недостаточно прав для выполнения данного действия."
}

Статус: 403 Forbidden

Проверка без авторизации (401)

curl -X GET http://127.0.0.1:8000/api/documents/

Ожидаемый ответ:

{
  "detail": "Учетные данные не были предоставлены."
}

Статус: 401 Unauthorized

2.5 Доступ администратора

Админ может смотреть документы

curl -X GET http://127.0.0.1:8000/api/documents/ \
  -b cookies_admin.txt

Ожидаемый ответ: JSON с документами (200 OK)

Админ может смотреть отчёты

curl -X GET http://127.0.0.1:8000/api/reports/ \
  -b cookies_admin.txt

Ожидаемый ответ:

{
  "reports": [
    {"id": 101, "total": 50000},
    {"id": 102, "total": 75000}
  ]
}

Статус: 200 OK

Админ может управлять ролями

curl -X GET http://127.0.0.1:8000/api/admin/roles/ \
  -b cookies_admin.txt

Ожидаемый ответ:

[
  {"id": 1, "name": "Admin"},
  {"id": 2, "name": "User"}
]

Статус: 200 OK

2.6 Мягкое удаление пользователя

Удаление аккаунта

CSRF=$(grep csrftoken cookies_user.txt | cut -f7)
curl -X DELETE http://127.0.0.1:8000/api/profile/ \
  -H "Content-Type: application/json" \
  -H "X-CSRFToken: $CSRF" \
  -b cookies_user.txt

Ожидаемый ответ:

{
  "message": "Аккаунт удалён"
}

Статус: 200 OK

Попытка входа после удаления

curl -X POST http://127.0.0.1:8000/api/login/ \
  -H "Content-Type: application/json" \
  -d '{"email": "user@test.com", "password": "user123"}'

Ожидаемый ответ:

{
  "error": "Аккаунт удалён"
}

Статус: 403 Forbidden

Проверка в базе данных

python manage.py shell
python
from accounts.models import User
user = User.objects.get(email='user@test.com')
print(user.is_active)  # Должно быть False

2.7 Выход из системы (Logout)

CSRF=$(grep csrftoken cookies_admin.txt | awk '{print $7}')
curl -X POST http://127.0.0.1:8000/api/logout/ \
  -H "X-CSRFToken: $CSRF" \
  -b cookies_admin.txt

Ожидаемый ответ:

{
  "message": "Выход выполнен"
}

Проверка после выхода:

curl -X GET http://127.0.0.1:8000/api/profile/ \
  -b cookies_admin.txt

Ожидаемый ответ:

{
"detail":"Учетные данные не были предоставлены."
}

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages