Реализация разрешений в PHP

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

<?php

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

$user = $editor;

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

?>
19.08.2008 23:11:49
10 ОТВЕТОВ
РЕШЕНИЕ

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

<?php

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

    $user = $editor;

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

?>

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

11
19.08.2008 23:17:43

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

<?php

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

    $user = $editor;

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

?>
2
19.08.2008 23:14:35

(2 | 4) оценивается как 6, но 2 == 6 неверно.

1
20.08.2008 06:01:46

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

1
19.08.2008 23:24:22
$guest = 1;
$editor = 2;
$admin = 4;

$user = $editor;

if (user == $editor || $user == $admin) {
    echo "Test";
}
1
19.08.2008 23:26:13

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

Может быть, я никогда так не делал. Я использовал побитовые операторы, чтобы хранить целую кучу настроек «да» или «нет» в одном числе в одном столбце в базе данных.

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

 ($editor | $admin)

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

 if ($user & $database_row['permissions']) {
       // display content
 } else {
       // display permissions error
 }
1
19.08.2008 23:39:48

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

0
19.08.2008 23:42:09

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

6
20.08.2008 02:39:00

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

Другая вещь, которая приходит на ум, это LiveUser . Мне тоже очень нравится с этим работать.

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

0
25.08.2008 16:52:11

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

2
25.08.2008 16:57:32