Setter v Security\Identity

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Vitek Jezek
hledá kolegy | 285
+
0
-

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

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

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

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

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)

LM
Člen | 206
+
0
-

To bude tím __get() který vrací odkaz, když zavoláš Identity::$roles tak to zavolá getRoles() což vrací odkaz na proměnou v té metodě (takže to nemá žádný efekt), kdežto __get('data') správně vrací odkaz na Identity::$data['data'].

Editoval LM (6. 1. 2009 19:23)

romansklenar
Člen | 655
+
0
-

Oj! Jojo máš pravdu, díky!

David Grudl
Nette Core | 8218
+
0
-

Držet Identity read-only asi nemá smysl, co? Udělám ji R/W

David Grudl
Nette Core | 8218
+
0
-

Od revize 186 se dá do objektu Identity zapisovat.