[docs] Přidána dokumentace systému přihlašování pro použití v jiných projektech

This commit is contained in:
stepan
2026-03-18 17:03:37 +01:00
parent 19c92c552d
commit 3c9267b1c5
+146
View File
@@ -0,0 +1,146 @@
# Systém přihlašování MSPPPPaM dokumentace pro implementaci
Tento dokument popisuje hotový systém přihlašování v PHP a MySQL,
který chci použít v novém projektu. Systém je připravený, neupravuj
jeho soubory pouze ho používej.
---
## Umístění souborů
Všechny soubory systému jsou ve složce `auth/` v kořenovém adresáři projektu.
---
## Seznam souborů a jejich funkce
| Soubor | Popis |
|---|---|
| `auth/config.php` | Veškerá konfigurace systému (DB přihlašovací údaje, URL, limity, přepínače). Upravuje se při nasazení. |
| `auth/db.php` | Připojení k MySQL přes PDO. Výsledkem je proměnná `$pdo`. |
| `auth/auth.php` | Hlavní soubor vkládá se na začátek chráněných stránek. Ověří přihlášení a nastaví proměnné (viz níže). |
| `auth/login.php` | Přihlašovací stránka s formulářem. Obsahuje ochranu proti brute force a CSRF. |
| `auth/logout.php` | Odhlášení zruší session i remember me cookie. Přesměruje na login. |
| `auth/registrace.php` | Registrace nového uživatele (pokud je povolena v config.php). |
| `auth/reset_hesla.php` | Formulář pro zaslání odkazu na obnovu hesla emailem. |
| `auth/nove_heslo.php` | Stránka z odkazu v emailu umožní zadat nové heslo. |
| `auth/admin.php` | Administrační rozhraní správa uživatelů, zobrazení konfigurace, test emailu. Přístupné pouze adminům. |
| `auth/mail.php` | Pomocná funkce `odesli_mail()` pro odesílání emailů přes PHP `mail()`. |
| `auth/install.php` | Jednorázový instalační skript vytvoří tabulky v DB a prvního admina. Po instalaci zablokován souborem `install.lock`. |
| `auth/js/heslo-sila.js` | JavaScript pro kontrolu síly hesla pomocí knihovny zxcvbn (Dropbox). Používají ho stránky s formuláři pro zadání hesla. |
---
## Jak použít systém na chráněné stránce
Na začátek každého PHP souboru, jehož obsah chci chránit, vložím:
```php
require_once 'auth/auth.php';
```
Po načtení jsou k dispozici tyto proměnné:
| Proměnná | Typ | Popis |
|---|---|---|
| `$auth_prihlasen` | `bool` | `true` pokud je uživatel přihlášen, jinak `false`. Nastaveno vždy. |
| `$auth_uzivatel['id']` | `int\|null` | ID přihlášeného uživatele, nebo `null` pokud není přihlášen. |
| `$auth_uzivatel['email']` | `string\|null` | Email přihlášeného uživatele, nebo `null`. |
| `$auth_uzivatel['admin']` | `bool` | `true` pokud je přihlášený uživatel admin, jinak `false`. Nastaveno vždy. |
| `$auth_logout_html` | `string` | Připravený HTML kód s emailem uživatele, tlačítkem odhlášení a (pro adminy) odkazem na administraci. Neprázdný pouze pokud je uživatel přihlášen. Použití: `echo $auth_logout_html;` |
| `$auth_login_html` | `string` | Připravený HTML formulář pro přihlášení (email, heslo, zapamatovat si mě, CSRF token). Neprázdný pouze pokud uživatel NENÍ přihlášen. Odesílá data na `login.php`, které po přihlášení přesměruje zpět na aktuální stránku. Použití: `echo $auth_login_html;` |
### Dva režimy fungování (nastavení v `auth/config.php`)
**`VYZADOVAT_PRIHLASENI = true`** (výchozí):
Nepřihlášený uživatel je automaticky přesměrován na přihlašovací stránku.
Na chráněnou stránku se dostane až po přihlášení.
**`VYZADOVAT_PRIHLASENI = false`**:
Stránka se zobrazí všem. Pomocí `$auth_prihlasen` si stránka sama
rozhodne, co nepřihlášenému uživateli ukáže.
---
## Databázové tabulky
Systém přihlašování vytváří a spravuje tyto tabulky:
### `auth_users` uživatelé přihlašovacího systému
| Sloupec | Typ | Popis |
|---|---|---|
| `id` | `INT UNSIGNED` | Primární klíč, auto increment |
| `email` | `VARCHAR(255)` | Email uživatele, unikátní |
| `heslo` | `VARCHAR(255)` | Bcrypt hash hesla |
| `admin` | `TINYINT(1)` | 0 = běžný uživatel, 1 = admin |
| `vytvoreno` | `DATETIME` | Datum a čas registrace |
### `auth_remember_tokens` tokeny pro "zapamatovat si mě"
Spravuje systém přihlašování automaticky. Není potřeba upravovat.
### `auth_brute_force` záznamy neúspěšných přihlášení
Spravuje systém přihlašování automaticky. Není potřeba upravovat.
### `auth_password_resets` tokeny pro obnovu hesla
Spravuje systém přihlašování automaticky. Není potřeba upravovat.
### `users` uživatelé konkrétní služby
Tato tabulka propojuje systém přihlašování s tvým projektem.
Systém přihlašování ji vytvoří při instalaci se základní strukturou:
| Sloupec | Typ | Popis |
|---|---|---|
| `id` | `INT UNSIGNED` | Primární klíč, auto increment |
| `uzivatel_id` | `INT UNSIGNED` | Cizí klíč na `auth_users.id` (ON DELETE CASCADE) |
**Tuto tabulku rozšíříš o vlastní sloupce** podle potřeb projektu
(jméno, telefon, nastavení, apod.). Systém přihlašování ji nebude
nijak měnit pouze při registraci nového uživatele do ní vloží
prázdný řádek s `uzivatel_id`.
Propojení s uživatelem přihlašovacího systému:
```sql
SELECT u.*, au.email
FROM users u
JOIN auth_users au ON au.id = u.uzivatel_id
WHERE u.uzivatel_id = :id
```
---
## Konfigurace (auth/config.php)
Při nasazení do projektu je potřeba vyplnit:
- `DB_HOST`, `DB_NAME`, `DB_USER`, `DB_PASS` přihlašovací údaje k MySQL
- `PROJEKT_NAZEV` název projektu (zobrazuje se na přihlašovací stránce)
- `PROJEKT_URL` základní URL webu (používá se v odkazech v emailech)
- `MAIL_ODESILATEL` emailová adresa odesílatele (musí být autorizována SPF záznamem domény)
- `MAIL_TEST_ADRESA` adresa pro testovací email v admin rozhraní
- `REGISTRACE_OTEVRENA` `true` = veřejná registrace, `false` = pouze admin zakládá uživatele
- `VYZADOVAT_PRIHLASENI` `true` = přesměrovat nepřihlášené, `false` = stránka rozhoduje sama
Cesty ke stránkám auth systému (pokud je složka `auth/` jinde než v kořeni webu):
- `AUTH_LOGIN_URL`, `AUTH_LOGOUT_URL`, `AUTH_ADMIN_URL`
- `AUTH_REGISTRACE_URL`, `AUTH_RESET_URL`
- `AUTH_REDIRECT_PO_PRIHLASENI` kam přesměrovat po přihlášení
---
## Bezpečnostní vlastnosti systému
Pro přehled systém řeší:
- Hesla hashována bcryptem (`password_hash` s `PASSWORD_DEFAULT`)
- Ochrana před SQL injection výhradně PDO prepared statements
- Ochrana před CSRF každý formulář obsahuje token ověřovaný na serveru
- Ochrana před brute force blokování po opakovaných neúspěšných pokusech
- Ochrana před session fixation `session_regenerate_id()` při přihlášení
- Ochrana před XSS `htmlspecialchars()` na všech výstupech
- Remember me bezpečný selector+token mechanismus (heslo ani ID není v cookie)
- Síla hesla kontrola přes zxcvbn (JavaScript) + minimální délka (PHP)
- Celá DB v `utf8mb4` plná podpora diakritiky a emoji