Dynamické ACL – kontrola platnosti session
Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
- VojtaSim
- Člen | 55
Zdravím,
mám dotaz jestli je dobré používat na ACL tento neortodoxní způsob
referující na toto
téma:
1. Při přihlášení uživatele se v DB
vytvoří/aktualizuje řádek s jeho userSession
konkrétně
ve funkci
$this->user->onLoggedIn[] = function(\Nette\Security\User $user) {
try {
$hash = Nette\Utils\Strings::random(10, '0-9A-Z');
$user->identity->sid = $this->sessionRepository->add($user->identity, $hash);
$user->identity->hash = $hash;
} catch (\Nette\Application\AbortException $e) {
$this->flashMessage($this->translator->translate($e->getMessage()), 'error');
$user->logout(TRUE);
$this->redirect('Auth:signin');
}
};
2. V UserStorage je podmínka kontrolující platnost, nebo vůbec existenci záznamu
if ($section->authenticated && $section->identity instanceof IIdentity) {
$sessionRecord = $this->sessionRepository->sessionExists($section->identity->sid);
if (!$sessionRecord) {
$section->authenticated = FALSE;
$section->reason = self::SECURITY_REASON;
if ($section->expireIdentity) {
unset($section->identity);
}
} else if ($sessionRecord->hash !== $section->identity->hash) {
unset($this->sessionHandler->getSection('user')->permissions);
// `->getSection('user')` udržuje práva uživatele + jazyk a další drobnosti
}
}
3. Potom to tedy znamená: invalidace SID = ohlášení;
invalidace Hashe = načtení nových práv
4. Při upravení práv skupiny se invalidují hashe
všech členů.
Editoval VojtaSim (4. 1. 2014 10:52)
- David Matějka
- Moderator | 6445
- to vytvareni sid a hashe presun do authenticatoru
- jestli se ti libi hash, jeho invalidace a znovu nacitani, pouzivej to. ja mam radeji neco jako tohle nebo tohle – tedy, ze v identite se drzi jen id (v tvem pripade i sid) a UserStorage vytahne pri kazdem pozadavku z db cerstvou, aktualni entitu (pripadne i prava)