Uzivatelske opravnenia pomocou bitovej masky
- mbskot
- Člen | 42
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
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
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?