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

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

<?php

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

$user = $editor;

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

?>
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
8
0
1 169
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

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

<?php

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

    $user = $editor;

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

?>
Ответ принят как подходящий

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

<?php

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

    $user = $editor;

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

?>

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

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

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

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

$user = $editor;

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

Awesome, this seems like the best way to do permissions in a CMS. Yes? No?

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

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

 ($editor | $admin)

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

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

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

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

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

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

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

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

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

Списки контроля доступа и объекты контроля доступа, хороший учебник?
В Visual Studio вы должны быть членом отладочных пользователей или администраторов, чтобы начать отладку. Что, если да, но это не работает?
Куда мне поместить файл журнала для приложения asp.net?
Как лучше всего обрабатывать несколько типов разрешений?
Как ограничить доступ в Azure DevOps только к одной конкретной плате?
Разрешение проверки USE_FULL_SCREEN_INTENT всегда возвращает GRANTED на Android 14
Можем ли мы предоставить участнику данных BLOB-объектов хранилища разрешение на регистрацию приложения Azure?
Как посмотреть логи в k8s из другого пространства имен
Как получить события группового календаря, используя разрешения только для приложений Azure? Ошибка: Доступ запрещен. Проверьте учетные данные и повторите попытку
Как проверить, не может ли пользователь отправлять сообщения (был ограничен или отключен звук) в чате Telegram с помощью Telethon API?