Jak aktualizovat data v Identity ?
- FilipStudený
- Člen | 8
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;
}
- ondraLE
- Člen | 23
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)