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

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
+
0
-
  1. to vytvareni sid a hashe presun do authenticatoru
  2. 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)