хранение разрешений в многомерном массиве php - PullRequest
5 голосов
/ 05 декабря 2011

Хорошо, я просто пытаюсь стать лучше в создании более слабосвязанных классов и т. Д. В PHP, чтобы улучшить свои навыки.У меня есть локальная тестовая база данных на моем компьютере, и для пользовательской таблицы у меня есть столбец с именем «роль».Я пытаюсь создать функцию, которая является общей функцией для получения разрешений для пользователя, поэтому она не зависит от конкретной задачи, которую он пытается выполнить.

Когда пользователь пытается сделать что-то, например, создатьновая тема на форуме и т. д., я хочу запросить базу данных, и, если «роль» - это определенное значение, сохранить разрешения в многомерном массиве, как показано ниже:

$permissions = array(
    'forums' => array("create", "delete", "edit", "lock"),
    'users' => array("edit", "lock")
);

Затем я хочу иметь возможность искать этомассив для конкретного разрешения без ввода следующего в верхней части каждого файла PHP после того, как пользователь отправил форму, проверив isset ($ var).Поэтому, если пользователь пытается отредактировать пользователя, я хочу иметь возможность сделать что-то вроде следующего с помощью метода класса, если это возможно

if (Class::get_permissions($userID),array($permissionType=>$permission))) {
   // do query
} else {
   // return error message
}

Как было бы хорошим способом иметь слабосвязанную функцию проверки разрешенийчто сможет сделать что то подобное?Он не должен быть выложен точно так же, как это, а просто быть слабо связанным, чтобы его можно было использовать повторно и не связывать с определенной задачей.Но я хочу иметь возможность иметь массив разрешений вместо просто «admin», «user» и т. Д. Для повторного использования, и это не ограничивает мои возможности в будущем.Потому что у меня есть куча кода, подобного этому, прямо сейчас в верхней части моих файлов сценариев php.

if (Class::get_permissions($userID) == "admin") {
   // allow query
} else {
   // return error
}

Спасибо за любой вклад, который поможет мне добраться до того места, где я не пишу то же самоевещи снова и снова.

Ответы [ 2 ]

3 голосов
/ 05 декабря 2011

Ваш вопрос немного расплывчат, но я сделаю все возможное.Вы сказали, что храните их разрешения в массиве $permissions.

public static $permissions = array();

public static function setPermissions($perms)
{
    if (!is_array($perms)) {
        throw new Exception('$perms must be an array.');
    }
    self::$permissions = $perms;
}

public static function hasPermission($section, $action)
{
    if (array_key_exists($section, self::$permissions)
        && in_array($action, self::$permissions[$section])
    ) {
        return true;
    }

    return false;
}

. Используя эту логику, когда вы читаете разрешения пользователя из БД, затем установите Class::$permissions статическую переменную следующим образом:

Class::setPermissions($permissions);
// ...
if (Class::hasPermissions($page, $action)) {
    // user has permission
}

Обратите внимание, мой код довольно общий и должен оставаться таким, пока я не получу больше информации.На данный момент я предполагаю, что ваш массив полномочий использует раздел страницы в качестве индекса, а массив представляет собой список действий в этом разделе страницы, к которым у пользователя есть доступ.Таким образом, предполагая, что $page было установлено на что-то вроде "forums", и пользователь в настоящее время пытается выполнить редактирование (так $action = 'edit'), функция Class::hasPermission() вернет true.

2 голосов
/ 05 декабря 2011

В комментариях закончились символы ... Но это к вашему комментарию.

@ corey вместо статического объекта я включаю функцию, которая устанавливает мои разрешения в сеансе пользователя. Это как часть моего класса LoginCommand, который вызывается всякий раз, когда пользователь входит в систему, очевидно.

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

Не забудьте проявлять хорошую безопасность сеанса. PHP Session Security

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

...