Autentizace v Nette Security – přidání dalších parametrů
- DefenestrationPraha
- Člen | 127
Řeším teď autentizaci v jednom projektu, kde je nezbytné mít vícefaktorovou autentizaci, například jednorázový kód zaslaný e-mailem či SMS, a narážím na to, že současné Nette bere autentizaci jako (username, password).
Jak třída Authenticator, funkce authenticate, tak i třída User, funkce login, bere jenom uživatelské jméno a heslo. To už je dnes trochu zastaralý přístup.
Rád bych věděl, co by si autoři Nette mysleli o možnosti přidat do signatury volitelnou array params:
public function authenticate(string $username, string $password, array $params = array())
do které by si konkrétní kód mohl nastrkat, co se mu zachce. Osobně jsem to tak u sebe udělal a odvodil si UserFacade od takto upraveného Authenticatoru, vše mi funguje hladce.
- Marek Bartoš
- Nette Blogger | 1280
Authenticator
je interface který vůbec nemusíš používat.
Zkrátka si po své ose vyrob objekt Identity
a předej ho
do $user->login($identity)
Editoval Marek Bartoš (21. 7. 2022 17:27)
- DefenestrationPraha
- Člen | 127
Jasně, určitě nemusíš, ale Nette se obecně snaží o to, aby na tu securitu myslelo jako první. V mnoha jiných situacích se vysloveně snaží předejít možným bezpečnostním slabinám.
Když už se celý ten framework snaží své uživatele dostrkat k tomu, aby tam neměli XSS apod., tak by se možná je měl snažit strkat i k co nejbezpečnějším praktikám přihlašování. V současné době si nejspíš několik dalších, možná i několik desítek dalších, uživatelů Nette v podobné situaci jako já naprogramovalo svoje vlastní řešení přihlašování. To je celkem zbytečná duplikace téže práce, plus tam vznikne další skupina lidí, která si řekne „a co, heslo stačí, proč bych to řešil, když mám výchozí komponentu na jméno a heslo přímo v Nette“.
Podle mě by mělo smysl podporovat defaultně 2FA, stejně jako má smysl defaultně escapovat HTML v Latte šablonách.
Abych jen nekecal, jsem ochoten se o to svoje řešení podělit formou nějakého Pull requestu.
Editoval DefenestrationPraha (21. 7. 2022 18:45)
- Marek Bartoš
- Nette Blogger | 1280
Doslova ti stačí ve své implementaci smazat
implements Authenticator
, výsledek volání
authenticate()
předat do $user->login()
a
parametry authenticate()
si přepsat jak potřebuješ. Ověření
uživatele pořád implementuješ sám, jen se to volá trochu jiným způsobem.
Bezpečnost tím nesnížíš ani nezvýšíš, je to prostě jen jiný
přístup.
- DefenestrationPraha
- Člen | 127
Marek Bartoš napsal(a):
Doslova ti stačí ve své implementaci smazat
implements Authenticator
, výsledek voláníauthenticate()
předat do$user->login()
a parametryauthenticate()
si přepsat jak potřebuješ.
Pořád si myslím, že jedním z důvodů, proč frameworky vůbec vznikají, je ten, aby jejich uživatelé nemuseli programovat pořád to samé dokola a neduplikovali tutéž práci na tisíc drobně odlišných způsobů. Podle mě by sada lepších autentizačních mechanismů v Nette dávala dobrý smysl. Zrovna tu autentizaci řeší skoro každý web, tak aby měl k dispozici něco spolehlivého.
Možná si v tomto nerozumíme, ale framework je přece skoro z definice sbírka užitečných funkcí a objektů daná dohromady proto, aby si je každý nemusel programovat znovu sám.
Bezpečnost tím nesnížíš ani nezvýšíš, je to prostě jen jiný přístup.
Dvoufaktorová autentizace se obecně považuje za bezpečnější než pouhé přihlášení heslem. Není to dokonalé řešení problému, to není v securitě nikdy, ale rozhodně bych polemizoval s myšlenkou, že přihlášení heslem je stejně bezpečné jako přihlášení více faktory. Není.
- DefenestrationPraha
- Člen | 127
Pepino napsal(a):
Díky, tak to mi přijde jako jednoznačná změna k horšímu.
- Marek Bartoš
- Nette Blogger | 1280
Oba mluvíme o něčem úplně jiném. To co jsem popisoval je totéž, co odkazoval David Kudera. Jen voláš metody jinak. O tom zda je lepší ověřování jen heslem nebo dvoufázově a zda by to nebylo fajn mít přímo v Nette jsem nenapsal vůbec nic. Pouze jsem reagoval na tvůj problém, že nevíš jak je možné předat krom jména a hesla i jiné údaje.
- DefenestrationPraha
- Člen | 127
David Kudera napsal(a):
Dřív jsem to řešil (ne)instalací tohoto:
Ano, to je jeden z problémů s jednomužnými pluginy, které nikdy nejsou začleněny do hlavního projektu … prostě na to jednoho dne te člověk přestane mít čas. Případně umře nebo něco jiného.
Takto třeba tiše zanikl další užitečný plugin pro PHPStorm – integrace Nette Testeru od Jiřího Pudila. Škoda, dokonce k němu existuje i pěkné video s vysvětlením základních funkcí.
- DefenestrationPraha
- Člen | 127
Marek Bartoš napsal(a):
Oba mluvíme o něčem úplně jiném. To co jsem popisoval je totéž, co odkazoval David Kudera. Jen voláš metody jinak. O tom zda je lepší ověřování jen heslem nebo dvoufázově a zda by to nebylo fajn mít přímo v Nette jsem nenapsal vůbec nic. Pouze jsem reagoval na tvůj problém, že nevíš jak je možné předat krom jména a hesla i jiné údaje.
Ano, tak teď už si rozumíme. Já jsem to mezitím u sebe nějak vyřešil, byť trochu jinak (napsal jsem si skript v PowerShellu, který prohledá vendor/nette a pozmění signatury metod authenticate() a login(), čímž to můžu automaticky udělat při každé aktualizaci Nette).
Existuje nějaký druh oficiálního kanálu, kam by mohli uživatelé navrhovat změny, které by v Nette rádi viděli? Ta 2FA je právě jednou z nich.
- David Matějka
- Moderator | 6445
- upravovat vendor je fakt špatný nápad
- Authenticator interface nepoužívej a poslechni rady @MarekBartoš
- navrhovat změny můžeš posláním pull requestu
- Marek Bartoš
- Nette Blogger | 1280
Já jsem to mezitím u sebe nějak vyřešil, byť trochu jinak (napsal jsem si skript v PowerShellu, který prohledá vendor/nette a pozmění signatury metod
Existují legitimní důvody, proč používat patche vendoru, ale v takovém případě se používá https://github.com/…oser-patches
Ber to tak, že Nette řeší, co je po přihlášení a ne to, co je před ním. Je to samostatné téma, na které můžeš použít i jinou knihovnu.
Autentizace je dost komplexní téma a pro komunikaci mezi servery, mezi serverem a mobilbí aplikací, serverem a webem a dalšími bude vypadat jinak. Celé tohle téma se snaží řešit kupříkladu OAuth. V php je dostupná implementace od phpleague (https://oauth2.thephpleague.com).
- DefenestrationPraha
- Člen | 127
David Matějka napsal(a):
- upravovat vendor je fakt špatný nápad
Rád bych si přečetl něco více o tom, proč. Mám za to, že jednou z výhod opensource je flexibilita.
- DefenestrationPraha
- Člen | 127
Marek Bartoš napsal(a):
Já jsem to mezitím u sebe nějak vyřešil, byť trochu jinak (napsal jsem si skript v PowerShellu, který prohledá vendor/nette a pozmění signatury metod
Existují legitimní důvody, proč používat patche vendoru, ale v takovém případě se používá https://github.com/…oser-patches
Ber to tak, že Nette řeší, co je po přihlášení a ne to, co je před ním. Je to samostatné téma, na které můžeš použít i jinou knihovnu.
Autentizace je dost komplexní téma a pro komunikaci mezi servery, mezi serverem a mobilbí aplikací, serverem a webem a dalšími bude vypadat jinak. Celé tohle téma se snaží řešit kupříkladu OAuth. V php je dostupná implementace od phpleague (https://oauth2.thephpleague.com).
Děkuji, prostuduji to.
- Marek Bartoš
- Nette Blogger | 1280
DefenestrationPraha napsal(a):
David Matějka napsal(a):
- upravovat vendor je fakt špatný nápad
Rád bych si přečetl něco více o tom, proč. Mám za to, že jednou z výhod opensource je flexibilita.
Upravovat vendor balíky můžeš, ale ne přímo vendor složku. Nevíš, co se kdy změní (aktualizace balíku, přepsání tvých změn composer pluginem nebo composerem). Buď si naklonuješ git repozitář a instaluješ svůj fork, nebo, pokud potřebuješ použít fixy z více větví, tak použiješ patch files skrze Composer plugin co jsem odkazoval.