Nette User Identity Data změna

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

Ahoj
dá se nějak změnit hodnota uložená v $user->identity->data[‚key‘] ??

Když to zkusím
$user->identity->data[‚key‘] = $key;

vypadne na mě

Indirect modification of overloaded property Nette\Security\Identity::$data has no effect

David Matějka
Moderator | 6445
+
0
-

zkus

$user->identity->key = $value;
Jan Suchánek
Člen | 404
+
0
-

@matej21: a je rozumné měnit něco v $this->user->identity, je to přepravka na tyto údaje? Nebo je lepší data na odpovídajícím místě vytáhnout a měnit přímo s DB?

MartinitCZ
Člen | 580
+
0
-

Doporučuji se $this->user->identity vyhýbat.
Řešení jsou dvě:

  1. Vytvořit si vlastní Nette\Security\Identity tak, aby data byla vždy aktuální.
  2. Vždy když potřebuješ použít informace o přihlášeném uživateli, tak si je vytáhneš z DB.
Jan Suchánek
Člen | 404
+
0
-

@martinit: Preferuju tu 2ku a data, či změny zobrazovat pomocí komponenty, která si je vytáhne z db pomocí repository (modelu).

ondraondra81
Člen | 82
+
0
-

No dvojka zní asi rozumně, ale to znamená pak vždy každému presenteru a každé akci předat hodnotu v proměnné $this->template->key …
Nebo to jde nějak jinak ?

Každopádně jsem narazil na problém, že i když změna user->identity->key = $key funguje (hodnota se změní), tak se to nepromítne když udělam handle pomocí ajaxu :(

BTW: měním to v tom identity protože předtím to změním v databázi.

David Matějka
Moderator | 6445
+
0
-

@ondraondra81:

tak se to nepromítne když udělam handle pomocí ajaxu :(

a invalidoval si tu cast stranky, kde jsou ty data?

jinak tento zpusob ma jeste tu nevyhodu, ze muzes upravovat session jen toho aktualniho uzivatele. Pokud tedy treba jako administrator zmenis nekomu jmeno nebo ho zablokujes, tak mu session nezmenis.

Ja pouzivam vlastni Identitu, ktera uklada do session pouze ID. Mam pak upravene UserStorage, ktere Identitu naloaduje. Inspirace treba tady

Jan Suchánek
Člen | 404
+
0
-

@matej21: Pěkně!

ondraondra81
Člen | 82
+
0
-

Tak už jsem to vymyslel :)

udělal jsem componentu a v basepresenteru volam jeji vytvoreni

Ale stále mě nefunguje reakce na změnu v ajax operaci

ondraondra81
Člen | 82
+
0
-

chjo jak prosté :) místo $this->redrawControl() bylo potřeba $this[‚userInfo‘]->redrawControl

Nicméně děkuji za nakopnutí s komponentou.

Ještě mě prosím řekněte jestli je správné předávat závislosti komponentě pomocí kontruktoru

function __construct($userId, Context $database)
    {
        $this->database = $database;
        $this->userId = $userId;
    }

a pak volani v presenteru

public function createComponentUserInfo()
    {
        return new UserInfo($this->user->getId(), $this->database);

    }

nebo se to ma dělat nějak jinak

Editoval ondraondra81 (27. 5. 2014 18:20)

Jan Suchánek
Člen | 404
+
0
-

Ja bych tu komponentu vytvořil pomoci továrny v neonu a předával jí rovnou nějakou Fasadu, která by pomáhala v zajišťování dalších operací a přímo by používala k práci User a Repository (ta by dostávala Nette\Database\Context), ale řešení od @matej21 je fikanější.

Edit:

@matej21 Nestačí ověřovat uživatele zda má či nemá BAN jen v checkAutorization? V případě vykopnutí ze systému je potřeba nějakým způsobem uživatele informovat.

Editoval jenicek (28. 5. 2014 11:10)