kam umístit nette autenticator?
- qteck
- Člen | 164
Ahoj,
něják si nevím rady s tím kam umístit autenticator.
Prdl jsem ho do basepresenteru, ale potom bude potřebovat zaregistrovat jako služba v configuje a říkám si, jestli je to rozumné?
Umístil jsem ho tam proto, protože tam vytvářím připojení k db.
Říkal jsem si že vytvoříl prvně složku v modelu authenticator.php a do něj umístím tu předepsanou metodu. Jenže jsem si uvědomil, že tam budu muset dědit base přesenter s připojením.
takže class authenticator extends basePresenter implements authenticator{}
jenže problém je v tom, že z příkladů je vidět, že authenticator dědí nette object.
Jak toto mohu vyřešit? Stačí nad tím prostě zavolat třeba místo
dědění:
USE nette\object
? a je to?
- duke
- Člen | 650
Do presenteru bych to nedával. Patří to do modelové vrstvy, což presenter není. Vytvoř si např. nějakou svou službu, která řeší (resp. zprostředkovává) vše kolem uživatelů a té přidej rozhraní Nette\Security\IAuthenticator a naimplementuj její metodu authenticate()
- qteck
- Člen | 164
jj udělal jsem to takto, šlomi předvším o to dědění nette object, nakonec jsem ho dal do baserepository, takže ho teď dědí všechn repositáře, což se mi možná nelíbí, ale opravdu by nemělo?
vytvořil jsem si Authenticator, podědil baserepository a implementoval iauthenticator.
zařegistroval jsem to do configu jako nromální službu a teď to jdu prubnout, tak prstíky pro mě.
- David Matějka
- Moderator | 6445
dedeni Nette\Object neni nutne, ale uzitecne, viz dokumentace, kde jsou popsany funkce Nette\Objectu
- qteck
- Člen | 164
oka,y díky.
nétte mi teď hlasí toto:
Nette\DI\ServiceCreationException
Class Repository\NetteAuthenticator used in service ‚authenticator‘ has not been found or is not instantiable.
v configu to mám zapsané takto:
services:
authenticator: Repository\NetteAuthenticator
a authenticator vypadá takto:
<?php
namespace Repository;
namespace App\Model;
use Nette,
Nette\Utils\Strings,
Nette\Security\Passwords;
/**
* Authenticator overridden by nette
*/
class NetteAuthenticator extends BaseRepository implements Nette\Security\IAuthenticator
{
const
TABLE_NAME = 'users',
COLUMN_ID = 'id',
COLUMN_NAME = 'name',
COLUMN_PASSWORD_HASH = 'password',
COLUMN_ROLE = 'role';
/**
* Performs an authentication.
* @return Nette\Security\Identity
* @throws Nette\Security\AuthenticationException
*/
public function authenticate(array $credentials)
{
list($username, $password) = $credentials;
$row = $this->conn->table(self::TABLE_NAME)->where(self::COLUMN_NAME, $username)->fetch();
if (!$row) {
throw new Nette\Security\AuthenticationException('The username is incorrect.', self::IDENTITY_NOT_FOUND);
} elseif (!Passwords::verify($password, $row[self::COLUMN_PASSWORD_HASH])) {
throw new Nette\Security\AuthenticationException('The password is incorrect.', self::INVALID_CREDENTIAL);
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
$row->update(array(
self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
));
}
$arr = $row->toArray();
unset($arr[self::COLUMN_PASSWORD_HASH]);
return new Nette\Security\Identity($row[self::COLUMN_ID], $row[self::COLUMN_ROLE], $arr);
}
/**
* Adds new user.
* @param string
* @param string
* @return void
*/
public function add($username, $password)
{
$this->database->table(self::TABLE_NAME)->insert(array(
self::COLUMN_NAME => $username,
self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
));
}
}
Co si o tom myslíte?
Díky
Editoval qteck (12. 6. 2014 17:48)
- duke
- Člen | 650
Dědičnost bys měl používat pouze tam, kde se jedná o vztah generalizace-specializace, což tento případ není, neboť autentikátor z logiky věci není speciálním případem repozitáře. Lepší řešení je kompozice, kdy autentikátoru předáš jako závislost repozitář uživatelů. Autentikátor může být řešen jako jednoduchá služba, která nic jiného než autentikaci neřeší, a nebo můžeš zvolit řešení, kdy máš nějakou fasádu Users, která řeší mj. i tu autentikaci.
- David Matějka
- Moderator | 6445
mas tam 2× uveden namespace:
namespace Repository;
namespace App\Model;
- qteck
- Člen | 164
ještě otázka,
k čemu tady v tom slouží ta poslední větev?
<?php
if (!$row) {
throw new Nette\Security\AuthenticationException('Uvedené jmeno je nesprávné.', self::IDENTITY_NOT_FOUND);
} elseif (md5($password) != $row[self::COLUMN_PASSWORD_HASH]) {
throw new Nette\Security\AuthenticationException('Zadané heslo je nesprávné.', self::INVALID_CREDENTIAL);
} elseif (Passwords::needsRehash($row[self::COLUMN_PASSWORD_HASH])) {
$row->update(array(
self::COLUMN_PASSWORD_HASH => Passwords::hash($password),
));
}
diky
- qteck
- Člen | 164
tak toto už vím:
- jen velké IIII V @inject
a ještě jedna teda,
hlásí mi to teď:
Fatal Error
Call to a member function add() on a non-object
<?php
/**
* Adds new user.
* @param string
* @param string
* @return void
*/
public function add($username, $password)
{
$this->conn->table(self::TABLE_NAME)->insert(array(
self::COLUMN_NAME => $username,
self::COLUMN_PASSWORD_HASH => md5($password),
));
}
a volám jí v presenteru klasicky $this->logIn->add()
log in je injecnnutá proměná,
/** @var \Repository\Auth @inject
Editoval qteck (12. 6. 2014 18:40)
- David Matějka
- Moderator | 6445
nemas ji protected? properties s @inject
anotaci museji
byt public
a tam k tomu needsRehash – tam se kontroluje, jestli je heslo zahashovano dostatecne silne a pripadne prehashuje
Editoval matej21 (12. 6. 2014 18:40)