PHP BitWise разрешения и роли, или альтернативы

Я делаю свое первое приложение, которое содержит разрешения и роли для нескольких пользователей. Насколько я понимаю, лучший способ сделать это - использовать форматирование BitWise. Это правда или есть лучшая альтернатива?

Это мой текущий тестовый код, и я получаю довольно странный эффект. Если бы кто-то мог пролить свет на то, почему это происходит так, как это происходит, это было бы очень ценно.

ПРИМЕР:

$user = array('permissions' => 1); // This *should* return ONLY READ, (except it shows all)
$user = array('permissions' => 8); // Shows correct, FULL resources.

Вы можете использовать это для проверки кода... http://writecodeonline.com/php/

define("PERM_R", 1);  # Read    
define("PERM_W", 2);  # Write   
define("PERM_E", 4);  # Edit    
define("PERM_D", 8);  # Delete  

define("ROLE_GUEST",  PERM_R);
define("ROLE_EDITOR", ROLE_GUEST | PERM_W | PERM_E);
define("ROLE_FULL",   ROLE_EDITOR | PERM_D);

function hasAccess($user, $action) {
    if( is_array($user) ) {
        return $user['permissions'] & $action;
    } else if ( is_int($user) ) {
        return $user & $action;
    }
}


$user = array('permissions' => 1);
echo "USER PERMISSIONS: ". $user['permissions'] ."<br /><br />";

# TEST PERMS
if(hasAccess($user, PERM_R)) {
    echo PERM_R;
    echo " - Yes you can see READ <br />";
}
if(hasAccess($user, PERM_R | PERM_W)) {
    echo PERM_R | PERM_W;
    echo " - Yes you can see READ & WRITE<br />";
}
if(hasAccess($user, PERM_R | PERM_W | PERM_E)) {
    echo PERM_R | PERM_W | PERM_E;
    echo " - Yes you can see READ & WRITE & EDIT<br />";
}
if(hasAccess($user, PERM_R | PERM_W | PERM_E | PERM_D)) {
    echo PERM_R | PERM_W | PERM_E | PERM_D;
    echo " - Yes you can see READ & WRITE & EDIT & DELETE<br />";
}

# TEST ROLES
if(hasAccess($user, ROLE_GUEST)) {
    echo ROLE_GUEST;
    echo " - Yes, You Are A GUEST <br />";
}
if(hasAccess($user, ROLE_EDITOR)) {
    echo ROLE_EDITOR;
    echo " - Yes, You Are A EDITOR <br />";
}
if(hasAccess($user, ROLE_FULL)) {
    echo ROLE_FULL;
    echo " - Yes, You Are A FULL <br />";
}

1 ответ

Решение

Проблема в том, что вы просто возвращаете результаты побитового & что для всех ваших тестов, по крайней мере 1/true потому что все пользователи имеют R разрешение.

  1. Подать только одно разрешение в hasAccess()прекратить использование |,
  2. Напишите новую функцию для определения уровня пользователя, который выполняет целочисленное сравнение.
Другие вопросы по тегам