Různé druhy přihlášení – best practice
- n.u.r.v.
- Člen | 485
Ahoj, zajímalo by mě, jak správně vyřešit následující případ:
Mám web, kde se pomocí klasického formuláře a authenticatoru přihlašuji… Ale zároveň se potřebuji nějak přihlásit i jinou formou a s jinými parametry – např. na jiném webu mám link na autologin, kdy se pomocí hashe ověří požadavek… v jiném případě se zase přihlašuji přes jinou kombinaci parametrů atd…
Takže se vlastně mění jen sql dotaz pro načtení usera z db, případně se před načtením ještě řeší platnost požadavku (hash a pod..). Druhá část (vytvoření identity atd..) je už ± stejná…
Řeším to zatím takto v autheticatoru – funguje to, ale nevím, zda je to správné/čisté řešení…
1) V presenteru volám login($loginType, $username, $pass,...);
kde $loginType je typ loginu
2) v authenticatoru je:
public function authenticate(array $credentials) {
if (count($credentials) > 1) {
switch ($credentials[0]) {//typ loginu
case "login"://klasicky login
return $this->login($credentials);
break;
case "autologinNeco1":
return $this->autologinSluzba1($credentials);
break;
case "autologinAdmin":
return $this->autologinSluzba2($credentials);
break;
default://neznamy typ loginu
throw new Security\AuthenticationException('Neznámý požadavek.', self::NOT_APPROVED);
break;
}
} else {
throw new Security\AuthenticationException('Neznámý požadavek.', self::NOT_APPROVED);
}
3) jednotlivé metody přebírající parametry:
např.
private function login(array $credentials) {
list($request, $username, $password) = $credentials;
$login = explode('_', $username);
$row = $this->database->queryArgs('SELECT ...',array($login[0], $username, $password))->fetch();
if ($row == FALSE) {
throw new Security\AuthenticationException('invalid_credentials', self::INVALID_CREDENTIAL);
} else {
$row = $this->fcCheckPermission($row);
$row = $this->fcSetAccount($row, $password);
$row = $this->unsetUnusedData($row);
return new Nette\Security\Identity($row['USER_ID'], $row['USER_TYPE'], $row);
}
}
apod. další metoda jen s jinýma param. a jiným sql...
}
Toto řešení mě funguje a nemám s tím zatím žádný problém, ale nějak se mi zdá, že je i nějaké lepší řešení. Jaký je Váš názor. Díky
Editoval n.u.r.v. (26. 9. 2014 9:50)
- Pavel Macháň
- Člen | 282
Pro každý způsob mít svůj authenticátor. Přijde mě to čistější a přehlednější.
- Vojtěch Dobeš
- Gold Partner | 1316
Dovolím si doporučit svůj doplněk multi-authenticator
bez jediného řádku kódu :).
- David Grudl
- Nette Core | 8235
Používat Nette\Security\IAuthenticator je bad practice ;-)
O IAuthorizator ani nemluvě.
- n.u.r.v.
- Člen | 485
David Grudl napsal(a):
Používat Nette\Security\IAuthenticator je bad practice ;-)
O IAuthorizator ani nemluvě.
A není to náhodou v dokumentaci https://doc.nette.org/…thentication ?
Takže chápu li dobře, nejlepší je použít multi-authenticator…
- Filip Procházka
- Moderator | 4668
@DavidGrudl IAuthenticator
možná, ale
IAuthorizator
je skvělej! Běda jak ho dropneš :P
- Jan Tvrdík
- Nette guru | 2595
@FilipProcházka Co je prosím tě na IAuthorizator
skvělého? RFC https://forum.nette.org/…r-a-identita#…
jsi viděl?
- enumag
- Člen | 2118
@bazo IAuthenticator je nevhodný protože pomocí něj není možné implementovat několik samostatných sekcí s odděleným přihlašováním – proto vznikl ten princip multiauthenticatoru. Není to ani tak workaround jako spíš good-practice (s „best“ jsem opatrný). Problémy IAuthorizatoru jsem popsal už dříve ve výše zmíněném RCF.