Dvě vrstvy ochrany
Base presenter SecuredPresenter, ze kterého dědí všechny admin presentery, řeší:
-
IP whitelist (vždy, pro všechny potomky) —
SecurityConfig::isIpAllowed(). Loopback + host obsahujícílocaljsou vždy povoleny; jinak IP musí být vparameters.adminSecurity.ipWhitelist. Prázdný seznam = žádná IP restrikce. -
Login (volitelně, per-presenter) — přes vlastnost
protected bool $requireLogin. Defaultfalse= jen IP (jako dřív). Neprihlášený se přesměruje naSign:in(sbacklink).
Rozšiřitelné: další sekci stačí přepnout $requireLogin = true.
Pro budoucí ACL je připraven hook requireRole($role) + sloupec role
(zatím jen admin s plným přístupem).
Co vyžaduje login vs. jen IP
| Sekce | Ochrana |
|---|---|
| PartnerAdmin (správa partnerů feedu) | login + IP |
| AdminUser (správa admin účtů) | login + IP |
| DropDashboard, Alza/Mall/Allegro/Kaufland/Decathlon, ApiLog(V2), NomenImage, SyncDropLog, KaratProduct, Packeta | jen IP |
| Homepage, Docu | otevřené (bez IP gate, dědí z UI\Presenter) |
Feed (/feed/data-r5/…), Picture (/picture/…) |
mimo login — vlastní auth (partner IP / today hash) |
Veřejné machine endpointy (feedy pro partnery, obrázky pro marketplace) nesmí
vyžadovat interaktivní login — proto z SecuredPresenter nedědí.
Login flow (Nette Security)
SignPresenter—/sign/in(formulář email + heslo, CSRF ochrana, spinner + disable tlačítka při odeslání) a/sign/out(logout). Nedědí zeSecuredPresenter(musí být dostupný odhlášenému), vlastní minimal layout.AdminAuthenticator(implementujeNette\Security\Authenticator) — ověří email + heslo protiadmin_users, vrátíSimpleIdentitys rolí a daty (name, email).- Hesla:
Nette\Security\Passwords(bcrypt), re-hash přineedsRehash. Generická chybová hláška (žádná user enumeration), jenis_activeúčty. - Po loginu Nette regeneruje session ID (obrana proti session fixation) → mění se
PHPSESSID. - Topbar (v
@layout.latte) čte$presenter->getUser()→ na všech stránkách zobrazuje jméno + „Odhlásit", odhlášeně „Přihlásit".
Session expirace 14 dní (common.neon). Karatní UserManager::userLoginByHash
(w_user_roles) je nezávislý starší systém pro jiný účel — nový login ho nevyužívá.
Správa admin účtů
Web CRUD: AdminUserPresenter (/admin-user/) — grid + formulář
(jméno, email, heslo, role, aktivní), delete a aktivace/deaktivace. Heslo při editu volitelné
(prázdné = ponechat). Nelze smazat/deaktivovat vlastní účet.
Bootstrap prvního admina (chicken-egg — web CRUD je sám za loginem): hash-chráněná console akce
/console/console-admin-user/create?hash=…&name=Jan&email=jan@vapol.cz&password=…
DB tabulka admin_users (Postgres)
Lokální tabulka (Nette Explorer, žádná Doctrine entita). DDL v database/change.sql.
| id | bigserial PK |
|---|---|
| name | VARCHAR(255) |
| VARCHAR(255) UNIQUE — přihlašovací jméno | |
| password_hash | VARCHAR(255) — bcrypt |
| role | VARCHAR(50) DEFAULT admin — ACL-ready |
| is_active | boolean — jen aktivní se přihlásí |
| last_login_ts, created_ts, updated_ts | timestamp |
Security:
- Security/AdminAuthenticator
- Security/SecurityConfig
- Model/Service/AdminUserManager
Presenter:
- Presenters/SecuredPresenter (base)
- Presenters/SignPresenter
- Presenters/AdminUserPresenter
- ConsoleModule/…/ConsoleAdminUserPresenter
Config:
- services.neon (authenticator, SecurityConfig)
- common.neon (adminSecurity.ipWhitelist)
- local.neon (prod override whitelistu)
Šablony:
- templates/Sign/@layout.latte + in.latte
- templates/AdminUser/default + edit
- templates/@layout.latte (topbar user menu)