Jak aktualizovat data v Identity ?

FilipStudený
Člen | 8
+
0
-

Zdravím, potřeboval bych poradit, jak co nejlépe provést aktualizaci dat v Identitě.

Především se jedná o profilový obrázek, uživatel nahraje nový profilový obrázek, který se uloží do adresáře a cesta se uloží do databáze, problém je v tom, profilový obrázek uživatele zobrazuji v navigačním poli a aby se nový profilový obrázek zobrazil, uživatel se musí znovu přihlásit, čemu bych se chtěl vyvarovat.

Existuje tedy nějaký způsob jak po nahrání profilového obrázku aktualizovat `profile_picture ` v SimpleIdentity, pokud je uživatel již přihlášen ?

        return new Nette\Security\SimpleIdentity($user['id'], 'admin', [
            'username' => $user['username'] ,
            'profile_picture' => $user['profile_picture'],
        ]);

Toto je moje CustomAuthentication třída, kterou požívám k autentikaci:

<?php

namespace App;

use Nette\Security\Authenticator;
use Nette\Security\IIdentity;

use Nette;
use Nette\Security\Passwords;
use Nette\Database\Explorer;

final class CustomAuthenticator implements Authenticator
{
    public function __construct(private readonly Explorer $database, private readonly Passwords $passwords){}
    function authenticate(string $username, string $password): IIdentity
    {
        $userData = $this->database->table('users')
            ->where('email = ? OR username = ?', $username, $username)
            ->fetch();

        if(!$userData){
            throw new Nette\Security\AuthenticationException("User doesn't exist", self::IDENTITY_NOT_FOUND);
        }else if(!$this->passwords->verify($password, $userData['password'])){
            throw new Nette\Security\AuthenticationException("Invalid password/username, try again", self::INVALID_CREDENTIAL);
        }else if($this->passwords->needsRehash($userData['password'])){
            //REHASH PASSWORD IF NEEDE
            $userData->update(['password' => $this->passwords->hash($password)]);
        }

        $user = $userData->toArray();
        //unset($user['password']);

        return new Nette\Security\SimpleIdentity($user['id'], 'admin', [
            'username' => $user['username'] ,
            'profile_picture' => $user['profile_picture'],
        ]);
    }

    /**
     * @throws \Exception
     */
    public function createNewUser(array $data): void
    {
        <zbytek kodu>
    }

}

A toto je moje metoda, která řeší uložení profilového obrázku, který uživatel nahrál:

    public function handlehandleUpload(): void
    {
        $userId = $this->getUser()->getId();
        $croppedImageData = $this->getParameter('croppedImageData');
        $imagePath = null;
        if ($croppedImageData) {
            $imagePath = $this->uploadImage($croppedImageData, $userId);
        }

        $this->userModel->updateProfilePicture($userId, $imagePath);
    }

    private function uploadImage($croppedImageData, string $userId): string
    {
        $decodedData = base64_decode(preg_replace('#^data:image/\w+;base64,#i', '', $croppedImageData));
        $imageName = uniqid() . '-' . $userId . '.jpeg';
        $uploadDir = __DIR__ . '/../../www/images/uploads/users/' . $userId . '/';

        if (!is_dir($uploadDir)) {
            mkdir($uploadDir, 0777, true);
        }

        $imagePath = $uploadDir . $imageName;
        file_put_contents($imagePath, $decodedData);

        return "/images/uploads/users/" . $userId . "/" . $imageName;
    }
Gappa
Nette Blogger | 206
+
+1
-

Na to by měla jít použít metoda wakeupIdentity:

ondraLE
Člen | 23
+
+1
-

Ahoj, nevím jestli je to ještě aktuální dotaz, ale včera jsem s tím strávil pěkný den.. nakonec je řešení velmi jednoduché, řeším takto v presenteru po odeslání nových dat a aktualizaci DB:

vezmu stávajícího usera:

<?php
$currentUser = $this->user->getIdentity();
//sestavím si data, která jsou následně v SimpleIdentity->getData() - pole
//např:
$data = ["name" => "Pepa", "age" => 55, "level" => 3];
//vytvořím instanci SimpleIdentity
$new_identity = new Nette\Security\SimpleIdentity($currentUser->getId(), $currentUser->getRoles(), $data);
$this->user->login($new_identity);
?>

Loginem dojde k aktualizaci storage přihlášeného usera. Login používá výše zmíněné wakeupIdentity a sleepIdentity..
..a to je vše.

Editoval ondraLE (10. 1. 15:24)