Uzivatelske opravnenia pomocou bitovej masky

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

Zdravim,
na strankach Nette som precital dost vela o ACL, rolach uzivatelov atd. Vyzera to celkom pekne, ale pre moje potreby je to prilis ‚hrube‘ zaobchadzanie s nastaveniami uzivatela.

V databaze mam pri kazdom uzivatelovi jedno cislo reprezentujuce jeho nastavenia(bitova maska).
Co ak chcem, aby nebol admin ako admin, tj. kazdy mal ine nastavenie(jeden moze potvrdzovat reg., iny moze potvrdzovat publikovane clanky, atd.).
Vzhladom na to, ze kombinacii nastaveni uzivatela je velmi vela, je nemyslitelne, aby na kazde nastavenie som mal vytvorenu rolu.
Je pravda, ze v tomto pripade hra ‚rola‘ akoby druhe husle. Admin nemusi mat ziadne prava a opacne member moze mat prava ako hlavny admin.

Kedze nerad by som ACL obisiel, prosim Vas o radu ako sa mam s tymto vysporiadat. Ak by som aj nepouzil ACL, rad by som vedel, ako by sa dalo nastavit Nette\Userovi podla masky prislusne uzivatelske prava.

Dakujem za odpovede.

Aurielle
Člen | 1281
+
0
-

Něco podobného jsem se pokoušel implementovat rozšířením Nette\Web\User, pro inspiraci koukni na můj příspěvek. Do anotace jsem uváděl konstantu, která obsahovala příslušný flag k ověření, a následně jsem ji ověřil v BasePresenteru (přes User::hasFlag): (dost divné řešení, jak se tak dívám na svůj kód :D)

/**
 * Has current user given flag?
 * @param mixed $flag
 * @param bool $constant Is passed value in $constant the value of constant or string that represents the constant?
 * @return bool
 */
public function hasFlag($flag, $constant = FALSE)
{
	if(is_string($flag) && preg_match('#^(ADMIN_|SM_)#', $flag))
	{
		if(!defined($flag))
			return FALSE;

		$flag = constant($flag);
	}
	elseif(is_array($flag))
	{
		$newflag = '';
		foreach($flag as $flg)
		{
			if(is_string($flg) && preg_match('#^(ADMIN_|SM_)#', $flg))
			{
				if(!defined($flg))
					return FALSE;

				$flg = constant($flg);
			}

			if(is_string($flg))
			{
				$newflag .= $flg;
			}
			elseif(is_numeric($flg))
			{
				$newflag = (int) $newflag | $flg;
			}
		}

		$flag = $newflag;
	}

	if(!self::isLoggedIn())
		return FALSE;

	if(empty($flag))
		return FALSE;

	if(is_numeric($flag))	// Web access flag
	{
		return (bool) ($this->identity->extraflags & $flag) != 0;
	}
	else	// Server access flag
	{
		if(strlen($flag) === 1)
			return strpos($this->identity->srv_flags, $flag) !== FALSE;
		else
		{
			for($i = 0; $i < strlen($flag); $i++)
			{
				if(strpos($this->identity->srv_flags, $flag[$i]) !== FALSE)
					return TRUE;
			}

			return FALSE;
		}
	}
}
mbskot
Člen | 42
+
0
-

Ak som to správne pochopil, tak do anotacii si vzdy umiestnil nazov flagu, kt. mal mat uzivatel nastaveny a funkciou User::hasFlag, ktoru si volal z basePresenteru si skontroloval kazde jedno volanie funkcie daneho presentera. ? A kde si mal definovane flagy? Pri prihlasovani usera si mu ich nastavil do identity?

Aurielle
Člen | 1281
+
0
-

Flagy byly v identitě (načítány z DB)

mbskot
Člen | 42
+
0
-

najs diki moc :)

mbskot
Člen | 42
+
0
-

este ma napadlo, ze komponenty maju tiez vlastne funkcie, kt. mozu byt zavisle od uzivatelskych nastaveniach, tak je vhodne spravit si nejaky BaseControl, kt. by mal rovnake funkcie ako BasePresenter?

Aurielle
Člen | 1281
+
0
-

Smysl to určitě má. Bohužel do vydání PHP 5.4 nejdou společné funkce pro BaseControl a BasePresenter vyřešit jinak než duplikací kódu.

mbskot
Člen | 42
+
0
-

caf,
sorry, ze tuto temu znova vytahujem, ale mam otazku ohladom tohto riesenia.
je vhodne pri tomto rieseni rozdelovat aplikaciu na fronted a backend?

Editoval mbskot (1. 7. 2011 16:32)