Autentizace uživatelů v Nette

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Honza Marek
Člen | 1664
+
0
-

Po delší době dělám něco v čistém a aktuálním Nette a nemůžu říct nic jiného než to, že uživatelé a jejich přihlašování je řešeno v Nette naprosto špatně.

  • Způsoby přihlašování jsou natolik rozdílné, že není nutné vynucovat si pro to nesmyslný interface (Nette\Security\IAuthenticator). V praxi bude užitečnější, když si v presenteru ručně seženu identitu po přihlášení heslem nebo po přihlášení přes FB a pak to ručně vložím do nějakého „UserManageru“, který si bude pamatovat, že je uživatel přihlášený. Bez prostřednictví třídy User a IAuthenticatoru bude princip přihlašování ohebnější a dokonce i pochopitelnější pro začátečníky.
  • Měl by být volitelný způsob (a na to udělaný interface) jak ukládat přihlášené uživatele. Doctrine entity nebo něco, co obsahuje Notorm_Row, není vhodné serializovat do session. Takže možnost nastavení vlastního ukládacího objektu s interfacem předepsanými metodami load($id) a save(IIdentity $user) by se šikla.
  • Identity z Nette je naprosto zbytečná třída, protože programátor chce používat pro identitu stejnou třídu (např. doctrine entitu) jako tu, kterou normálně v aplikaci reprezentuje uživatele. Měl by existovat jen nějaký minimální interface IIdentity s getId.
  • IIdentity by neměla mít metodu getRoles protože zdaleka ne každý chce autorizovat pomocí rolí.
  • Zařadil bych nové výjimky InvalidCredentialException a IdentityNotFoundException dědící z AuthenticationException místo těch chybových kódů. Pokud si tohle přesně nepamatuju, tak je mnohem jednodušší si v IDE najít třídy výjimek (\Nette\Security\ctrl + space) než dohledávat nějaké divné kódy.

Tohle jsou prosím připomínky zatím jen k autentizaci, k autorizaci jsem se teď ještě nedostal, tak si to nepamatuju tak přesně, abych o tom něco smysluplného napsal :)

Tyhle problémy snad řeší pull request Honzy Tichého, byť se mi tam nelíbí sem tam nějaký název něčeho a tak. Každopádně by se s touhle částí Nette mělo něco dělat.

P.S.: Zcela výjimečně nebudu dávat za vzor Symfony, protože to jejich přihlašování sice vypadá ohebně, ale je natolik složité, že jsem ho dosud nepochopil ;-)

Mikulas Dite
Člen | 756
+
0
-

Rozhodně mi některé body dávají smysl, třeba

>> programátor chce používat pro identitu stejnou třídu (např. doctrine entitu) jako tu, kterou normálně v aplikaci reprezentuje uživatele

mluvíš za všechny.

Možná by ale stálo za to vydat nejdřív stable 2.0 (s finální DI, atp). Tohle bude tak jako tak BC break jak kráva a šel by vyřešit elegantně s nástupem traits (User extends Entity + trait dnešní Identity).

Takže zatím navrhuju chvíli počkat (doufejme, že php 5.4 přijde brzo).

PetrP
Člen | 587
+
0
-

Z většinou souhlasím.

Identity z Nette je naprosto zbytečná třída, protože programátor chce používat pro identitu stejnou třídu (např. doctrine entitu) jako tu, kterou normálně v aplikaci reprezentuje uživatele.

Ale s tímhle nesouhlasím. Né každý používá orm aby měl entitu uživatele. Případně jí nepotřebuje protože přihlašování je řešeno nějak triviálně (jako Nette\Security\SimpleAuthenticator).

Tedy pro defaultní jednoduchou implementaci IIdentity využití vidím.

Spíš bych použití speciální třídy s identitou nevyžadoval – tak jako je to teď, protože musí být schopná se serializovat do session.

To by řešilo nějaký ten IIdentityStorage kdy by umožnilo použít přímo entitu uživatele jako identitu (když by implementovala IIdentity).


Jinak myslím že UserManageru = User, jen je špatně navržena. Chybý jí právě metody na nastavení identity. A vyšlenení na uložiště identit.

PetrP
Člen | 587
+
0
-

Mikulas Dite:

ano řešit tohle zároveň s tím jak nette poslední rok (dva?) stagnuje by bylo spíše kontrapruduktivní.

(User extends Entity + trait dnešní Identity)

To se mi zdá zbytečné, zvláště když IIdentity by mělo jen getId. Většinou entity už takovou metudu i mají :-)

David Grudl
Nette Core | 7790
+
0
-

Honza Marek napsal(a):

Po delší době dělám něco v čistém a aktuálním Nette a nemůžu říct nic jiného než to, že uživatelé a jejich přihlašování je řešeno v Nette naprosto špatně.

  • Způsoby přihlašování jsou natolik rozdílné, že není nutné vynucovat si pro to nesmyslný interface (Nette\Security\IAuthenticator).

Souhlas. Současná implementace je z dob, kdy nic jiného, než přihlášení jménem a heslem nepřicházelo v úvahu, dnes jsou alternativní přihlašování běžné.

  • Měl by být volitelný způsob (a na to udělaný interface) jak ukládat přihlášené uživatele.

Myslíš jak nebo kam ukládat? Pokud skutečně jak, tak tohle by měla řešit IIdentity.

  • Identity z Nette je naprosto zbytečná třída, protože programátor chce používat pro identitu stejnou třídu (např. doctrine entitu) jako tu, kterou normálně v aplikaci reprezentuje uživatele. Měl by existovat jen nějaký minimální interface IIdentity s getId.

Rozlišil bych mezi zbytečnou třídou a třídou, kterou sám nepotřebuju.

  • IIdentity by neměla mít metodu getRoles protože zdaleka ne každý chce autorizovat pomocí rolí.

Souhlas.

  • Zařadil bych nové výjimky InvalidCredentialException a IdentityNotFoundException dědící z AuthenticationException místo těch chybových kódů. Pokud si tohle přesně nepamatuju, tak je mnohem jednodušší si v IDE najít třídy výjimek (\Nette\Security\ctrl + space) než dohledávat nějaké divné kódy.

Jelikož to samotný framework nepotřebuje rozlišovat, záleželo by na konsensu uživatelů.

Šaman
Člen | 2594
+
0
-

Honza Marek napsal(a):

programátor chce používat pro identitu stejnou třídu (např. doctrine entitu) jako tu, kterou normálně v aplikaci reprezentuje uživatele. Měl by existovat jen nějaký minimální interface IIdentity

Souhlasím, na toto jsem narazil už několikrát a to i když jsem žádné ORM nepoužíval, jen jsem se snažil napsat si model podle 5ti vrstvého vzoru.

Editoval Šaman (13. 11. 2011 20:53)

Honza Marek
Člen | 1664
+
0
-
  • Měl by být volitelný způsob (a na to udělaný interface) jak ukládat přihlášené uživatele.

Myslíš jak nebo kam ukládat? Pokud skutečně jak, tak tohle by měla řešit IIdentity.

Potřebuju mít možnost, abych si mohl do session uložit jen id identity a pak ji načítat z nějakého IIdentityStorage pomocí takového kódu:

public function load($id)
{
	return $this->em->getRepository('MyApp\Model\User')->find($id);
}

Rozlišil bych mezi zbytečnou třídou a třídou, kterou sám nepotřebuju.

Ok, tady jsem použil příliš silnou formulaci. Defaultní implementace ve frameworku určitě být může, ale neměl bych být nucen ji používat.