Table of Contents
- Company Files – Wiki (instrukcja akademicka)
- Spis treści
- 1. Cel dydaktyczny
- 2. Struktura repozytorium i uzasadnienie
- 3. Architektura (diagramy)
- 3.1. Diagram komponentów
- 3.2. Sekwencja: logowanie + lista dokumentów
- 3.3. Sekwencja: upload + download
- 4. Model danych
- 5. Autoryzacja (JWT)
- 6. Uprawnienia i reguły dostępu (ACL)
- 7. Endpointy API (przegląd)
- 8. Uruchomienie (dev)
- 9. Testowanie API
- 10. Bezpieczeństwo (media / ACL / production storage)
- 11. Proponowany scenariusz laboratoriów
- 12. Kryteria oceniania (rubryka)
- 13. Możliwości rozbudowy (zadania dodatkowe)
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Company Files – Wiki (instrukcja akademicka)
Projekt demonstracyjny do zajęć z backendów: Django REST API + osobny, uproszczony frontend (statyczny HTML/JS). Temat: zarządzanie firmowymi plikami (upload i udostępnianie), wewnętrzne wiadomości oraz lista zadań TODO.
Spis treści
- 1. Cel dydaktyczny
- 2. Struktura repozytorium i uzasadnienie
- 3. Architektura (diagramy)
- 4. Model danych
- 5. Autoryzacja (JWT)
- 6. Uprawnienia i reguły dostępu (ACL)
- 7. Endpointy API (przegląd)
- 8. Uruchomienie (dev)
- 9. Testowanie API
- 10. Bezpieczeństwo (media / ACL / production storage)
- 11. Proponowany scenariusz laboratoriów
- 12. Kryteria oceniania (rubryka)
- 13. Możliwości rozbudowy (zadania dodatkowe)
1. Cel dydaktyczny
Po zrealizowaniu ćwiczeń student:
- rozumie rozdział warstw (frontend ↔ REST API),
- potrafi zaprojektować modele danych i relacje (w tym relacje „dostępowe”),
- wdraża autoryzację JWT i sprawdzanie uprawnień obiektowych,
- testuje API w Swagger UI oraz curl/fetch,
- potrafi wskazać najważniejsze ryzyka bezpieczeństwa dla uploadu plików i współdzielenia.
2. Struktura repozytorium i uzasadnienie
Repo jest celowo zorganizowane jak mini-monorepo:
backend/– Django + DRF (logika, dane, autoryzacja, API)frontend/– statyczny HTML/CSS/JS (minimalny klient do prezentacji API)requirements.txt– zależności backendu
Uzasadnienie:
- warstwy można wdrażać niezależnie,
- typowy układ „API + osobny UI” jest bliższy realnym projektom,
- łatwo pokazać CORS i JWT w praktyce.
3. Architektura (diagramy)
3.1. Diagram komponentów
flowchart LR
B[Przeglądarka] -->|HTTP: HTML/CSS/JS| F[Frontend statyczny]
B -->|HTTP JSON + JWT| API[Django REST API]
API -->|ORM| DB[(SQLite)]
API -->|FileField| FS[(MEDIA_ROOT / media/)]
API --> DOCS[Swagger/OpenAPI]
3.2. Sekwencja: logowanie + lista dokumentów
sequenceDiagram
participant U as Użytkownik (Frontend)
participant A as API (JWT)
participant D as API (Documents)
U->>A: POST /api/auth/token/ (username, password)
A-->>U: access + refresh (JWT)
U->>D: GET /api/documents/ (Authorization: Bearer access)
D-->>U: lista dokumentów (własne + udostępnione)
3.3. Sekwencja: upload + download
sequenceDiagram
participant U as Frontend
participant API as Django REST API
participant FS as Storage (media/)
U->>API: POST /api/documents/ (multipart/form-data)
API->>FS: zapis pliku
API-->>U: 201 + metadane dokumentu
U->>API: GET /api/documents/{id}/download/
API->>FS: odczyt pliku
API-->>U: FileResponse (download)
4. Model danych
Główne byty:
- Document – dokument z plikiem i metadanymi (właściciel, tytuł, daty).
- DocumentShare – udostępnienie dokumentu użytkownikowi z uprawnieniem
readlubwrite. - Message – wiadomość wewnętrzna (nadawca, odbiorca, temat, treść, znacznik przeczytania).
- TodoItem – zadanie użytkownika (tytuł, opis, status, opcjonalny termin).
Uzasadnienie:
- oddzielna tabela udostępnień to dobry wzorzec pod przyszłe rozszerzenia (role/grupy/wygasanie/audyt),
- wiadomości i TODO to proste, czytelne CRUD-y do ćwiczenia filtrów i uprawnień.
5. Autoryzacja (JWT)
Stosujemy JWT (SimpleJWT), bo to typowe podejście dla klientów SPA i aplikacji mobilnych.
Endpointy:
POST /api/auth/token/→access+refreshPOST /api/auth/token/refresh/→ nowyaccess
Wymagany nagłówek:
Authorization: Bearer <access>
6. Uprawnienia i reguły dostępu (ACL)
Dokumenty
- Właściciel: pełny dostęp (CRUD + download + share).
- Udostępnione:
GET/HEAD/OPTIONS– dozwolone, jeśli istnieje share,PUT/PATCH– dozwolone tylko przypermission=write,DELETE– tylko właściciel (nawet przywrite).
Udostępnienia
- zarządzanie udostępnieniami dokumentu jest dozwolone tylko dla właściciela.
Wiadomości
- użytkownik widzi tylko swoje wiadomości (inbox/outbox),
- oznaczenie jako przeczytane działa tylko dla odbiorcy.
TODO
- użytkownik zarządza tylko własnymi zadaniami.
7. Endpointy API (przegląd)
Dokumentacja:
- Swagger UI:
GET /api/docs/ - OpenAPI schema:
GET /api/schema/
Autoryzacja:
POST /api/auth/token/POST /api/auth/token/refresh/
Użytkownicy:
GET /api/users/me/GET /api/users/?q=...
Dokumenty:
GET/POST /api/documents/GET/PATCH/PUT/DELETE /api/documents/{id}/GET /api/documents/{id}/download/GET/POST /api/documents/{id}/shares/(tylko właściciel)
TODO:
GET/POST /api/todos/GET/PATCH/PUT/DELETE /api/todos/{id}/
Wiadomości:
GET/POST /api/messages/GET /api/messages/?mailbox=inbox|outboxPOST /api/messages/{id}/mark-read/
8. Uruchomienie (dev)
Wymagania:
- Python 3.11+ (projekt działa na 3.13)
8.1. Backend
python3 -m pip install -r requirements.txt
cd backend
python3 manage.py migrate
python3 manage.py createsuperuser
python3 manage.py runserver
Linki:
- Admin: http://127.0.0.1:8000/admin/
- Swagger UI: http://127.0.0.1:8000/api/docs/
- OpenAPI: http://127.0.0.1:8000/api/schema/
8.2. Frontend (statyczny)
cd frontend
python3 -m http.server 5173
Otwórz: http://127.0.0.1:5173/
9. Testowanie API
9.1. Swagger UI
- Otwórz
GET /api/docs/ - Zaloguj się przez
POST /api/auth/token/i skopiujaccess - Wysyłaj żądania z
Authorization: Bearer <access>
9.2. curl (smoke test)
Token:
curl -s -X POST http://127.0.0.1:8000/api/auth/token/ \
-H 'Content-Type: application/json' \
-d '{"username":"admin","password":"HASLO"}'
Lista dokumentów:
curl -s http://127.0.0.1:8000/api/documents/ \
-H "Authorization: Bearer ACCESS_TOKEN"
10. Bezpieczeństwo (media / ACL / production storage)
Ta sekcja jest celowo „akademicka”: pokazuje, co w dev jest uproszczone, a w produkcji wymaga dodatkowych mechanizmów.
10.1. Upload i przechowywanie plików
Ryzyka:
- upload złośliwych plików,
- brak limitów rozmiaru i liczby plików,
- problemy wydajnościowe przy serwowaniu plików przez aplikację,
- zbyt łatwe udostępnienie pliku „publicznie” (np. błędna konfiguracja serwera).
Dobre praktyki (production):
- limity uploadu (Django + reverse proxy),
- walidacja MIME/rozszerzeń, ewentualnie skanowanie AV,
- obiektowy storage (S3/MinIO) zamiast lokalnego dysku,
- podpisywane URL-e / dedykowana warstwa download,
- audyt: kto pobierał pliki i kiedy.
10.2. ACL i IDOR
Ryzyka:
- IDOR (dostęp do obiektu po ID bez sprawdzenia uprawnień),
- błędy w logice „owner vs shared” prowadzące do wycieku danych.
Dobre praktyki:
- uprawnienia obiektowe zawsze po stronie backendu,
- zasada najmniejszych uprawnień (
readjako domyślne), - rozważ wygasanie udostępnień i historię zmian.
10.3. JWT
Ryzyka:
- kradzież tokenu (np. XSS),
- zbyt długie TTL,
- brak rotacji/blacklisty refresh tokenów.
Dobre praktyki:
- krótki TTL dla
access, - ochrona frontendu przed XSS,
- rozważenie rotacji/blacklisty refresh tokenów w produkcji.
11. Proponowany scenariusz laboratoriów
- Rozruch: instalacja, migracje, admin, Swagger.
- JWT: tokeny, nagłówek
Authorization, refresh tokenu. - TODO: CRUD +
PATCH is_done. - Wiadomości: inbox/outbox +
mark-read. - Dokumenty: upload multipart + download.
- Udostępnianie:
read/write, weryfikacja dostępu (testy negatywne). - Frontend: wykonanie tych samych operacji z przeglądarki.
12. Kryteria oceniania (rubryka)
- Poprawność funkcjonalna (40%): endpointy i przypadki użycia działają zgodnie z opisem.
- Autoryzacja i uprawnienia (25%): brak IDOR, poprawna kontrola dostępu do dokumentów/wiadomości/TODO.
- Jakość API (20%): sensowne kody HTTP, walidacje, spójność, pagination gdzie potrzeba.
- Czytelność i utrzymanie (15%): modularność, nazewnictwo, porządek w aplikacji.
13. Możliwości rozbudowy (zadania dodatkowe)
Poniższe propozycje są „dodatkowymi możliwościami rozbudowy” (zadania osobno), zgodnie z tematem z zajęć:
- Diagramy: diagram klas (modele/relacje), diagramy ACL, diagram wdrożeniowy (dev vs prod).
- Scenariusze laboratoriów: warianty ćwiczeń, checklisty testów negatywnych, praca w parach (owner/share).
- Zadania domowe:
- wersjonowanie dokumentów (historia pliku),
- wygasające udostępnienia (expiry),
- grupy/role i dziedziczenie uprawnień,
- wyszukiwarka + filtrowanie + sortowanie,
- powiadomienia o wiadomościach/udostępnieniach.
- Bezpieczeństwo: media/ACL/production storage:
- limity uploadu + walidacja MIME,
- migracja storage do S3/MinIO,
- podpisywane linki do pobrań,
- audyt logów pobrań,
- rotacja/blacklista refresh tokenów i polityki TTL.