Autentizace a vyuziti mysql db
- TanisCZ
- Člen | 80
Zdravím,
Jelikož mi nejde založit téma v sekci Autentizace a autorizace, tak píšu prosbu sem.
Velice se mi libí systém autentizace a autorizace vyvinutý v Nette.
V příkladech je vše pěkně vysvětleno, ale narazil jsem na jeden
problém.
Dejme tomu, že mám tabulku, kde mám ulolžené jména a hesla
uživatelů.
Pomocí SimpleAuthenticatoru určitě nějak půjde udělat to, abych mohl
dostat seznam uživatelů z db a ten pak předat v přihlašovacím
formuláři…
Ale jak na to?:/
- Jod
- Člen | 701
A prečo nepoužiješ to čo je v dokumentácii Nette\Permission .
Ja to používam a ide mi to perfektne.
Vysvetlím:
Spravíš si prihlasovací formulár, po odoslaní zavoláš metódu
Environment::getUser()->authenticate(array $credentials)
kde $credential sú meno a heslo ako array(‚username‘ ⇒ ‚jod‘, ‚password‘ ⇒ ‚tazke‘).
Príklad:
<?php
function formSubmitted($form)
{
try {
$user = Environment::getUser();
$user->authenticate($form['username']->getValue(), $form['password']->getValue());
$user->setExpiration(3600, true, true);
if(!empty($this->backlink))
$this->getApplication()->restoreRequest($this->backlink);
else
$this->redirect('Presenter:View');
} catch (AuthenticationException $e) {
$form->addError('Nesprávne prihlasovacie údaje');
}
}
?>
Mne to funguje, dúfam, že to pomohlo aj tebe ,)
- ViliamKopecky
- Nette hipster | 230
TanisCZ napsal(a):
Hmm
Environment::getUser()->authenticate(array $credentials)
to znamená, že musim mít implementovanou třídu User pomocí dibiTable, tak aby mi vytáhla data z db? Tak nějak je to napsané v příkladu na akrabat.forms.
Ne, nejlepší řešení je napsat si vlastní
AuthenticationHandler
(inspiraci hledej v
SimpleAuthenticatoru
), třída, aby měla metodu
authenticate($username, $password)
a uvnitř se připojíš do DB,
zkontroluješ správnost a budto vyhodíš nějakou
AuthenticationException
, nebo vrátíš nějaký objekt
Identity
.
- Jod
- Člen | 701
Šak dobre píše, tak ako to má tu Nette\Permission .
Ja to tiež tak používam
config.ini
service.Nette-Security-IAuthenticator = Users
Users.php
<?php
class Users extends DibiTable implements /*Nette\Security\*/IAuthenticator
{
public function authenticate(array $credentials) {}
}
?>
Editoval Jod (6. 11. 2008 12:49)
- romansklenar
- Člen | 655
TanisCZ napsal(a):
Hmm
Environment::getUser()->authenticate(array $credentials)
to znamená, že musim mít implementovanou třídu User pomocí dibiTable, tak aby mi vytáhla data z db? Tak nějak je to napsané v příkladu na akrabat.forms.
Jak říkal @enoice, není třeba mít kvůli
autentizačnímu handleru dědit z DibiTable, jako je v dokumentaci:
„Třída Users bude autentizační handler, neboli třída
Users
z příkladu Akrabat
z distribuce.
Tu obohatíme o pár řádek kódu: …“ – bylo to původně
myšleno, jako lehké obohacení akrabatu o další feature :)
Autentizační handler může být jakýkoliv tvůj objekt, kterému
naimplementuješ rozhraní IAuthenticator,
to co bude v metodě authenticate()
,
např. jestli se bude přihlašovat přes mysql nebo LDAP, je jen na tobě.
- TanisCZ
- Člen | 80
Super, už jsem to pochopil. Ty role nejsou vůbec špatnej nápad, vůbec
jsem netušil, že něco takového půjde do php dostat, zvlášť když role
využívají dědění. Paráda… Jenom ještě jeden dotázek pomocí
user->isAuthenticated()
zjistím, zda je uživatel
přihlášený to je mi jasný, ale je tu nějaký možnost, jak zjistit, jestli
je přihlášený konkrétní uživatel třebas pepa?