Různé druhy přihlášení – best practice

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

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
+
0
-

Pro každý způsob mít svůj authenticátor. Přijde mě to čistější a přehlednější.

n.u.r.v.
Člen | 485
+
0
-

Pavel Macháň napsal(a):

Pro každý způsob mít svůj authenticátor. Přijde mě to čistější a přehlednější.

Taky jsem si něco takového myslel.. teď jen musím zjisti, jak mít v app. více authenticatorů…

mkoubik
Člen | 728
+
+1
-

n.u.r.v. napsal(a):
Taky jsem si něco takového myslel.. teď jen musím zjisti, jak mít v app. více authenticatorů…

$identity = $this->authenticator(...);
$this->user->login($identity);
n.u.r.v.
Člen | 485
+
0
-

mkoubik napsal(a):

n.u.r.v. napsal(a):
Taky jsem si něco takového myslel.. teď jen musím zjisti, jak mít v app. více authenticatorů…

$identity = $this->authenticator(...);
$this->user->login($identity);

áá, výborně…jdu to zkusit…díky

Vojtěch Dobeš
Gold Partner | 1316
+
+10
-

Dovolím si doporučit svůj doplněk multi-authenticator bez jediného řádku kódu :).

majky358
Člen | 37
+
0
-

Riešenie nad je fajn čisté :) Ale když som mal napr. jednom formulárovy login a FB login tak som si len vytvoril 2 metódy rozličné v 1 auhenticatoru :)

David Grudl
Nette Core | 8235
+
+1
-

Používat Nette\Security\IAuthenticator je bad practice ;-)

O IAuthorizator ani nemluvě.

n.u.r.v.
Člen | 485
+
0
-

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…

enumag
Člen | 2118
+
+2
-

@DavidGrudl To není žádná novinka, ale neměl bys pár tipů na good practice? :-)

EDIT: S autorizací mimo IAuthorizator a User je trochu problém, konkrétně jak ji napojit na anotace a checkRequirements.

Editoval enumag (24. 9. 2014 14:25)

bazo
Člen | 620
+
0
-

David Grudl napsal(a):

Používat Nette\Security\IAuthenticator je bad practice ;-)

O IAuthorizator ani nemluvě.

hej? preco?

Filip Procházka
Moderator | 4668
+
0
-

@DavidGrudl IAuthenticator možná, ale IAuthorizator je skvělej! Běda jak ho dropneš :P

@bazo vojtech-dobes/nette-multi-authenticator

Jan Tvrdík
Nette guru | 2595
+
+2
-

@FilipProcházka Co je prosím tě na IAuthorizator skvělého? RFC https://forum.nette.org/…r-a-identita#… jsi viděl?

Filip Procházka
Moderator | 4668
+
+1
-

@JanTvrdík viděl, pěkně to vyhnilo, že? :)

bazo
Člen | 620
+
-1
-

@FilipProcházka to nie je velmi odpoved na moju otazku :D len workaround ked potrebujes viac authenticatorov.

enumag
Člen | 2118
+
+2
-

@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.

Filip Procházka
Moderator | 4668
+
+4
-

@bazo mně to nepřijde jako workaround ale jako regulérní řešení.