Вопрос
Я пытался сделать это несколько раз, но безуспешно.После прочтения этот пост, это заставило меня заинтересоваться тем, чтобы сделать это снова.Итак, кто-нибудь может сказать мне, почему следующее не работает?
<?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-логики прямо в середину вашего приложения.Это не самое лучшее, что нужно сделать, чтобы сохранить его простым и расширяемым.;)