Authentikace a authorizace

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

Zdar všem, dělali jste někdo v Nette už s authentikací a authorizací? Jak na to? Mě se to pořád nějak nedaří ze zdrojáků vyčíst. Nejspíš pomocí třídy Web::User, ale netuším, jak to používat. Instance nejspíš v bootstrapu, jestli se nepletu tak to zároveň nastartuje session. Ale jak dál? Jestli někdo máte aspoň jednoduchý funkční příklad, který by používal User v alespoň dvou presenterech (jestli stačí na pochopení, tak i v jednom :) ), byl bych velmi zavázán za jeho zveřejnění.

Petr Daňa
Člen | 109
+
0
-

Hm, klasika, když po dlouhým neúspěšným pátrání někam napíšu dotaz, tak pak na to za chvíli přijdu sám. No, takže Environment::getUser() je nespíš ta správná cesta. Tak jdu zkoumat dál.

Patrik Votoček
Člen | 2221
+
0
-

Petr Daňa napsal(a):

Hm, klasika, když po dlouhým neúspěšným pátrání někam napíšu dotaz, tak pak na to za chvíli přijdu sám. No, takže Environment::getUser() je nespíš ta správná cesta. Tak jdu zkoumat dál.

Pokud příjdeš na něco srozumitelného a použitelného tak by jsi mohl napsat malý tutorialek… Taky by se me to hodilo… :-)

Petr Daňa
Člen | 109
+
0
-

Zatím si s tím jen hraju, ale myslím, že ten základ mám, tak sem hodím aspoň tohle, třeba na to navážou další (momentálně zkoumám zas něco jiného, takže jsem další pokusy s Userem odložil).

Do bootstrapu dáme následující (poznámky k danému kusu kódu jsou vždy pod ním):

$auth = new SimpleAuthenticator(array('admin' => 'admin'));

Tohle je jen dočasná (pro testování, než vytvořím vlastní Authenticator třídu spolupracující s db) tabulka uživatelů, předává se jí pole s prvky ‚user‘ ⇒ ‚heslo‘.

$user = Environment::getUser();
$user->setAuthenticationHandler($auth);

A teď už použití – Environment::getUser() je statická metoda, takže použitelná odkudkoliv. V bootstrapu nastavíme authentikační třídu (nyní ten SimpleAuthenticator, později vlastní třída implementující IAuthenticator).

try
{
  $user->authenticate('admin', 'admin2');
} catch (AuthenticationException $ex)
{
  switch ($ex->getCode())
  {
    case IAuthenticator::IDENTITY_NOT_FOUND:
      break;
    case IAuthenticator::INVALID_CREDENTIAL:
      break;
  }
}

Tohle mám kvůli testování taky v bootstrapu, ale pak to bude v daném presenteru či komponentě pro login. Volá se metoda authenticate (ta je ve třídě SimpleAuthenticator) předají se jí parametry user a heslo. Je to v try bloku, protože v dané implementaci se při neznámém uživateli či chybném hesle vyhazují výjimky.

Pak už je použití třeba v presenterech jednoduché:

$user = Environment::getUser();

$this->template->page = $user->getIdentity()->getName() ." > ". ($user->isAuthenticated() ? "true" : "false");

Do proměnné page v šabloně uloží jméno uživatele a příznak, zda je authentikovaný (tj. přihlášení proběhlo v pořádku nebo ne).

Odhlášení jsem ještě nezkoušel, ale bude to myslím:

$user->signOut()

Jak jsem psal, není to nic moc popis, opravdu jen základ, ale třeba to pomůže lidem v podobné situaci jako u mě, tj. že netuší, jak to kde všechno funguje :) Nezkoušel jsem ještě práci s rolema, ale to bude taky obdobně jednoduchý (aspoň doufám :) ). Tak třeba někomu ušetřím práci (ať žije xdebug :) ).

Hm, teď si tak říkám, jestli tu neťápu moc velký blbosti, jestli jo, tak ať to David kdyžtak smaže ;)

Editoval Petr Daňa (24. 4. 2008 15:24)

cuga
Člen | 210
+
0
-

co presne vraci metoda getName().

Prepracoval jsem priklad Akrabat.forms spolecne s module-usage.

Kdyz dam:

<?php

$user = Environment::getUser();
$this->template->jmeno = $user->getIdentity()->getName();

?>

tak potom v sablone kdyz dam {!jmeno} nevypise se nic.

Diky za odpoved

_Martin_
Generous Backer | 679
+
0
-

Neměl by jsi dát {$jmeno}?

cuga
Člen | 210
+
0
-

nn, myslim ze v tom problem neni. Ostatne mi ani neni poradne jasne, kde se naleza implementace metody getName(). Kde je implementace, ktera rika, odkud z db nacist jmeno uzivatele.

David Grudl
Nette Core | 8218
+
0
-

getName definuje interface IIdentity, v příkladě konkrétně třída Identity. Ta je velmi jednoduchá a vlastně jen vrací proměnné $name, $roles, $data, která se uvedou v konstruktoru. Instanci vytváří IAuthenticator, v příkladu jde o třídu Users. Zkus se podívat do jejího kódu.

Jod
Člen | 701
+
0
-

Cugo, je to konkrétne následujúci riadok, keby si bol lenivý kukať sa ,)

<?php

return new /*Nette\Security\*/Identity($identityName, $roles, $userData);

?>

V tvojom prípade je zaujímavý práve ten prvý argument.

Editoval Jod (23. 10. 2008 13:25)

cuga
Člen | 210
+
0
-

Jod napsal(a):

Cugo, je to konkrétne následujúci riadok, keby si bol lenivý kukať sa ,)

<?php

return new /*Nette\Security\*/Identity($identityName, $roles, $userData);

?>

V tvojom prípade je zaujímavý práve ten prvý argument.

Diky moc za nakopnuti, uz to beha. Akorat to chtelo upravit ten zdrojak na:

<?php
		return new /*Nette\Security\*/Identity($row['full_name'], array(), $row);
?>

Nejsem jeste v objektovem phpku az tak kovany, ale muzete me nekdo nakopnout, jestli melo fungovat $row->full_name (proto $row['full_name'], protoze u me v tom akrabatu nefungovalo ani $row->password pro overovani hesla.

A jeste jeden dotaz… kde se v tride Users urcuje z ktere db tabulky ma dibi tahat data??? Nebo musi byt jmeno db tabulky shodne s jmenem tridy???

Editoval cuga (23. 10. 2008 15:47)

David Grudl
Nette Core | 8218
+
0
-

Ano, pokud se nestanoví jinak, odvodí se název tabulky z názvu třídy, viz Experiment DibiTable.

V jedné z posledních verzí dibi funguje $row->full_name i $row['full_name'] zároveň.

cuga
Člen | 210
+
0
-

David Grudl napsal(a):

Ano, pokud se nestanoví jinak, odvodí se název tabulky z názvu třídy, viz Experiment DibiTable.

V jedné z posledních verzí dibi funguje $row->full_name i $row['full_name'] zároveň.

aaaaaaaha, tak to uz vysvetluje mnohe :) sem mel verzi dibi starou jak metuzalem :)