Вопрос

Я начал разрабатывать приложение для форума в PHP в My Framework MVC, и я попал на сцену, где я назначаю разрешения членам (например: чтение, запись, обновление, удаление).

Теперь я знаю, что могу добавить 5 столбцов под пользовательской таблицей в моей базе данных и установить их на 1 | 0, но это мне кажется слишком много, если я хочу добавить другие правила, как двигаться, например.

И как я могу динамически назначить эти привилегии их для пользователей индивидуально?

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

У вас есть пример того, как я могу это реализовать?

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

Решение

Описанный вами метод - индивидуальные привилегии, хранящиеся в столбцах, - это просто за счет гибкости (как вы заметили).

Метод Zuul еще более прост и по существу то же самое, что и ваш, за исключением того, что он позволяет избежать необходимости в каких-либо заявлениях «ALTER TABLE». Однако он не нормализуется, не легко запрошен, а не самодостаток.

Другая проблема с обоями этих методов состоит в том, что по мере роста вашей пользовательской базы вы найдете его всё больше от боли, чтобы удерживать привилегии всех набор правильно. Вы окажетесь многими пользователями, которые нуждаются в том же привилегии. Тем не менее, чтобы изменить привилегии пользователя, например, для размещения новой привилегии, вам придется войти и добавить эту привилегию каждому пользователю, который нуждается в этом индивидуально. Главная пита.

Для форума, вероятно, вам понадобится управление привилегию для каждого пользователя. Более вероятно, что у вас будут определенные классы пользователей, таких как анонимные пользователи, вошли в систему пользователей, модераторы, администраторы и т. Д. Это сделало бы его хорошо подходящим для контроля доступа на основе ролей (RBAC). В этой системе вы бы назначали каждому пользователю роль и предоставлять привилегии к роли. Привилегии будут храниться как строки в таблице «привилегии». Таким образом, упрощенная схема базы данных будет выглядеть так:

PRIVILEGE
int id (primary key)
varchar description

ROLE_PRIVILEGE_JOIN
privilege_id (foreign key)
role_id (foreign key)

ROLE
int id (primary key)
varchar description

USER
int id (primary key)
int role_id (foreign key)

Этот шаблон используется во многих приложениях, которые занимаются привилегиями пользователя. Добавить каждую привилегию, что любой может иметь в качестве ряда в таблице привилегии; добавить каждую роль, которую любой пользователь может иметь в таблице роли; и связать их соответствующим образом в таблице ROLE_PRIVILEGE_JOIN.

Единственный реальный недостаток заключается в том, что используются таблица присоединения, используется запрос «USER X DO y Y», будет несколько медленнее.

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

Bitmask разрешений лучше всего понять, когда они представлены как двоичные, с каждой цифрой, представляющей находку или выключений разрешения. Так что если разрешения X, Y и Z существуют, и у меня есть только доступ к X и Z, 101 Предполагается бы, что у меня есть первые и третьи разрешения, предоставленные мне, но не второй. Двоичный номер 101 эквивалентно десятичному числу 5, Так что это то, что в конечном итоге хранится в базе данных. Один небольшое целое число является гораздо более эффективным объектом для хранения, чем строка или несколько небольших целых чисел.

РЕДАКТИРОВАТЬ: Я понял, насколько легко было использовать существующие функции преобразования, чтобы получить довольно быструю реализацию. Вот образец.

<?php
function bitmask_expand($n) {
  // 9 returns array(1, 0, 0, 1)
  return str_split(base_convert($n, 10, 2));
}

function bitmask_compact($a) {
  // array(1, 0, 0, 1) returns 9
  return (int) base_convert(implode($a), 2, 10);
}

$ns = range(0, 7);
foreach($ns as $n) {
  print_r($b = bitmask_expand($n));
  echo bitmask_compact($b), "\n\n";
}

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

Я бы создал стол под названием «роли»:

CREATE TABLE Roles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 rolename VARCHAR(30))

Придерживайтесь любых разрешений, которые вы хотите там. Затем создайте таблицу под названием «UseRols», чтобы связать пользователей к ролям:

CREATE TABLE UserRoles(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY(id),
 UserId INT,
 RoleID INT)

Много гибкости и легко создавать (то есть рабочий процесс, правила и т. Д.) (Я бы также добавил внешние ключи)

Вам не нужно усложнять это, просто используйте поле «Ex: Personsions» и сделать что-то вроде:

$ permissions = "1; 1; 0; 1";

Где в вашей концерна это читается:

Читать - 1 (может)

Написать - 1 (может)

Обновление - 0 (не может)

Удалить - 1 (может)

Затем, когда проверка, просто используйте «взорваться» «;» ...

Таким образом, вы всегда можете применить больше типов разрешений, не меняя таблицу ... Таким образом, вы получите таблицу меньше, а ваш запрос быстрее!

Это обходной путь для вашей проблемы :)

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