Setter v Security\Identity
- Vitek Jezek
- hledá kolegy | 285
neslo by udelat setter pro $data do Identity? Nebo se to ted da delat nejak jinak? (kazdej uzivatel u me si muze vybrat jazyk, ktery se uklada jednak do SQL pro dalsi prihlaseni, ale pro toto prihlaseni jsem potreboval setter.) Ja si ho tam teda ted dopsal sam, ale pri kazdem upgradu bych na to musel myslet (a urcite to vyuziji i jini uzivatele).
- romansklenar
- Člen | 655
Nevyplnila by tuhle potřebu extension method?
function Identity_prototype_setData(Identity $_this, $key, $value)
{
$_this->data[$key] = $value;
}
EDIT: Ne nevyplnila, $data
je private
:-(
Editoval romansklenar (6. 1. 2009 2:10)
- krajaac
- Člen | 45
Napadá mě jedno řešení, co si podědit třídu Identity
–
může se jmenovat třeba MyIdentity
, přidat do ní setter pro
data a v autentizacnim handleru (sluzba
Nette\Security\IAuthenticator
) v metode
authenticate($credentials)
vracet instanci MyIdentity
namisto bezne Identity
. Pak by melo nastavovani pres setter
normalne fungovat odkudkoliv…
Ja jsem nedavno resil podobny problem – updatoval jsem uzivatelska data do
DB, ktera byla se nachazela i v Identite a trochu jsem to obesel. Podedil jsem
si tridu User
→ MyUser
a pridal do ni fci
refreshIdentity()
, ta mi zavola stejnojmennou fci v autentizacnim
handleru (u me prida Users) a vrati nove nactenou Identitu. Tu pak v
MyUser->refreshIdentity
ulozim pres metodu
setIdentity()
.
Krasne a jednoduche :)
Jeste dodam, ze v bootstrapu jsem musel prenastavit sluzbu
IUser
timto
prikazem: Environment::getServiceLocator()->addService(new MyUser, 'Nette\Web\IUser');
Editoval krajaac (6. 1. 2009 11:14)
- paranoiq
- Člen | 392
to by šlo. takto jsem to řešil také
spolu s vlastní implementací IIdentity se musí napsat také vlastní implementace IAuthenticator. ten totiž objekt impl. IIdentity vytváří a třída je tam natvrdo. a vlastní IAuthenticator pak už zbývá jen zaregistrovat jako službu, třeba v ini: „service.Nette-Security-IAuthenticator = MyAuthenticator“
- romansklenar
- Člen | 655
romansklenar napsal(a):
Nevyplnila by tuhle potřebu extension method?
function Identity_prototype_setData(Identity $_this, $key, $value) { $_this->data[$key] = $value; }
Tak jsem si to zkoušel ověřit:
$user = Environment::getUser();
$identity = $user->getIdentity();
Debug::dump($identity);
object(Identity) (3) {
"name" private => string(5) "admin"
"roles" private => array(7) { ... }
"data" private => array(2) {
"username" => string(5) "admin"
"nicename" => string(14) "Administrátor"
}
}
$identity->setData('blah-blah', 'blah-blah-blah');
Debug::dump($identity);
// objekt $identity po zavolání setData()
object(Identity) (3) {
"name" private => string(5) "admin"
"roles" private => array(7) { ... }
"data" private => array(3) {
"username" => string(5) "admin"
"nicename" => string(14) "Administrátor"
"data" => array(1) {
"blah-blah" => string(14) "blah-blah-blah"
}
}
}
A něco není správně, protože pokud si dumpnu
$_this->data
v extension method, dostanu
array(1) {
"blah-blah" => string(14) "blah-blah-blah"
}
ale když zkusím
function Identity_prototype_setData(Identity $_this, $key, $value)
{
$_this->roles[] = $value;
}
dostanu správně chybu
Notice: Indirect modification of overloaded property Identity::$roles has no effect in C:\...
Není tam někde chyba v zapouzření?
Editoval romansklenar (6. 1. 2009 18:15)