Вопрос

Я пытался сделать это несколько раз, но безуспешно.После прочтения этот пост, это заставило меня заинтересоваться тем, чтобы сделать это снова.Итак, кто-нибудь может сказать мне, почему следующее не работает?

<?php

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if( $user == ($editor | $admin) ) {
    echo "Test";    
}

?>
Это было полезно?

Решение

Используйте побитовый оператор OR (|) для установки битов, используйте оператор AND (&) для проверки битов.Ваш код должен выглядеть примерно так:

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( $user & ($editor | $admin) ) {
        echo "Test";    
    }

?>

Если вы не понимаете двоичный код и точно, что делают побитовые операторы, вам следует изучить его.Вы поймете, как это сделать, намного лучше.

Другие советы

В интересах не изобретать велосипед заново, почему бы не взглянуть на системы ACL / аутентификации, такие как Zend ACL и Zend Автор?Оба варианта могут использоваться независимо от Zend Framework в целом.Контроль доступа - сложная ситуация, поэтому полезно хотя бы взглянуть на то, как это делают другие системы.

Прошло много времени с тех пор, как я использовал PHP, но я предполагаю, что это сработает:

<?php

    $guest = 1;
    $editor = 2;
    $admin = 4;

    $user = $editor;

    if( ($user == $editor) || ($user == $admin) ) {
        echo "Test";    
    }

?>

Я использовал это в отчетах об ошибках, и это работает довольно хорошо.Что касается пользовательских разрешений, это должно работать очень хорошо - у вас может быть несколько столбцов для каждого пользовательского разрешения в вашей базе данных или один столбец уровня пользователя в вашей базе данных.Выбирайте этот вариант.

(2/4) вычисляется как 6, но 2 == 6 равно false.

@mk:(2/4) оценивается как 6.

$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if (user == $editor || $user == $admin) {
    echo "Test";
}

Потрясающе, это кажется лучшим способом получения разрешений в CMS.Да?Нет?

Может быть, на самом деле я никогда не делал этого таким образом.То, что я сделал, - это использовал побитовые операторы для хранения целого набора настроек "да или нет" в виде одного числа в одном столбце базы данных.

Я думаю, что для разрешений этот способ будет хорошо работать, если вы хотите сохранить разрешения в базе данных.Если кто-то хочет опубликовать какой-то контент и хочет, чтобы его видели только администраторы и редакторы, вам просто нужно сохранить результат

 ($editor | $admin)

зайдите в базу данных, затем, чтобы проверить это, сделайте что-то вроде

 if ($user & $database_row['permissions']) {
       // display content
 } else {
       // display permissions error
 }

На мой взгляд, это не очень хорошо масштабируется.На самом деле я не пробовал использовать это в крупномасштабном проекте, но CMS кажется слишком сложной для использования.

Это всегда зависит от того, что вам нужно.Если вы уже знакомы с Zend Framework, то я бы поддержал предложение Zend_Acl / _Auth, которое было сделано ранее.Но имейте в виду, что каждый фреймворк, вероятно, поставляется с аналогичным компонентом.

Еще одна вещь, которая приходит на ум, это Живой пользователь.Мне тоже очень нравится с ним работать.

Я думаю, вы можете делать практически все, что угодно, и хотя ваш подход выглядит очень простым, он также ограничен, поскольку (через все эти if ()) вы собираетесь поместить большую часть ACL-логики прямо в середину вашего приложения.Это не самое лучшее, что нужно сделать, чтобы сохранить его простым и расширяемым.;)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top