Forums / National / Russian / Тех. поддержка / дожились? или права пользователей

Sergey
#22695 2010-02-05 05:34
Давайте рассмотрим мой вариант нашей функции sed_auth_getvalue из модуля functions.admin.php
function mobil_auth_getvalue($mask)  
{
$mn['0'] = 0;
$mn['R'] = 1;
$mn['W'] = 2;
$mn['L'] = 2;
$mn['1'] = 4;
$mn['2'] = 8;
$mn['3'] = 16;
$mn['4'] = 32;
$mn['5'] = 64;
$mn['A'] = 128;

$masks = str_split($mask);

foreach($mn as $k => $v)
 {
 if (in_array($k, $masks)) { $res += $mn[$k]; }
 }
return($res);
}
Что делает эта функция? Она берет пользовательское обозначение прав и превращает их в компактную форму. Например, $mask =RW, функция str_split превращает входное значение в массив состоящий из двух элементов R и W, другая функция in_array($k, $masks) ищет перебирая массив $mn ассоциативные коды в $masks. В нашем случае это будут коды R и W со значениями $mn['R'] = 1; и $mn['W'] = 2; Найденные значения суммируются. Получится 3. Т.е. число 3 это есть битовое указание на R и W. Обратите внимание, в функции есть и эквивалент $mn['W'] = 2; это $mn['L'] = 2;
Теперь давайте выстроим массив $mn так:

бит 1 $mn['R'] = 1;
бит 2 $mn['W'] = 2;
бит 3 $mn['1'] = 4;
бит 4 $mn['2'] = 8;
бит 5 $mn['3'] = 16;
бит 6 $mn['4'] = 32;
бит 7 $mn['5'] = 64;
бит 8 $mn['A'] = 128;

Для того, чтобы получить значение бита из сгруппированного кода прав (записываемого в поле таблице для строки) необходимо проделать следующую операцию:
$бит = (($код_прав & $маска_бита(ов)) == $маска_бита(ов));

$бит будет иметь, в такой операции два состояния: FALSE или TRUE. Следовательно если маска_бита (например) равна 2, то мы сразу выясним. может ли в данную строку что-либо записано т.е. если W в е правах. Однако можно проверить и сумму прав, достаточно сложить нужные биты. Например RA (имеем право читать и администрировать) этот код будет = 1+128=129.
В MySQL имеется и соответственная функция (6.3.6.1 Битовые функции) функция побитового сложения т.е. &
которая, как раз и предназначена для этих целей: выборке строк соответствующих функции побитового сложения, в нашем случае поиску строк с определенными правами. Эта функция выполняется на самом низком операционном уровне процессора, практически мгновенно. В 3 шага микропроцессора. Придумывать другой механизм, это значит увеличивать количество машинных кодов в сотни (тысячи раз) вместо 3. (я так гипотически, может и 2 шага, все в особенностях куда маска на какой регистр улетела, но это уже не нашего ума дела)
www.cotonti.mobi