Dvě vrstvy ochrany

Base presenter SecuredPresenter, ze kterého dědí všechny admin presentery, řeší:

  1. IP whitelist (vždy, pro všechny potomky) — SecurityConfig::isIpAllowed(). Loopback + host obsahující local jsou vždy povoleny; jinak IP musí být v parameters.adminSecurity.ipWhitelist. Prázdný seznam = žádná IP restrikce.
  2. Login (volitelně, per-presenter) — přes vlastnost protected bool $requireLogin. Default false = jen IP (jako dřív). Neprihlášený se přesměruje na Sign:in (s backlink).

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
SekceOchrana
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í ze SecuredPresenter (musí být dostupný odhlášenému), vlastní minimal layout.
  • AdminAuthenticator (implementuje Nette\Security\Authenticator) — ověří email + heslo proti admin_users, vrátí SimpleIdentity s rolí a daty (name, email).
  • Hesla: Nette\Security\Passwords (bcrypt), re-hash při needsRehash. Generická chybová hláška (žádná user enumeration), jen is_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.

idbigserial PK
nameVARCHAR(255)
emailVARCHAR(255) UNIQUE — přihlašovací jméno
password_hashVARCHAR(255) — bcrypt
roleVARCHAR(50) DEFAULT admin — ACL-ready
is_activeboolean — jen aktivní se přihlásí
last_login_ts, created_ts, updated_tstimestamp
Klíčové soubory

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)
Nomen
Otevřít celou stránku ↗

Načítání...

Karat objednávka
Otevřít celou stránku ↗

Načítání...