Как использовать chmod в качестве типа данных MySQL - PullRequest
2 голосов
/ 22 апреля 2011

В настоящее время я создаю таблицу разрешений, которая реплицирует метод "777", используемый в Linux.

Для этого я хотел создать таблицу типа:

user_id, class1, class2, class3

Где класс может быть какой-то функцией на веб-сайте, которая требует разрешения.

Похоже, это хороший способ сделать это?Есть ли проблемы с этим методом?

Кроме того, какой тип данных лучше всего подходит для этих данных.Я мог бы использовать INT (3), но я предполагаю, что нет «двоичного» типа данных, который бы повторял этот тип вещей

1 Ответ

5 голосов
/ 22 апреля 2011

Использование set('ru', 'rg', ro', 'wu', 'wg', 'wo', 'xu', 'xg', 'xo', 'sgid', 'suid', 't')

Это оптимизировано по битам.

Однако, если вам нужно отфильтровать отдельные разрешения (например, «выбрать всех пользователей, которые могут читать отсюда»), вылучше реализовать его в виде простых таблиц «многие ко многим»:

user_permissions (object_id, user_id, permission ENUM ('r', 'w', 'x'))
group_permissions (object_id, group_id, permission ENUM ('r', 'w', 'x'))
other_permissions (object_id, permission ENUM('r', 'w', 'x', 'sgid', 'suid', 't'))

с каждым разрешением в отдельной записи, создать ограничения PRIMARY KEY:

object_id, permission, user_id
object_id, permission, group_id,
object_id, permission

и запрос:

SELECT  u.id
FROM    user_permissions up
JOIN    users u
ON      u.id = up.user_id
WHERE   object_id = $object
        AND permission = 'r'
UNION
SELECT  g.user_id
FROM    group_permissions gp
JOIN    user_groups ug
ON      ug.group_id = gp.group_id
WHERE   object_id = $object
        AND permission = 'r'
UNION
SELECT  u.id
FROM    users u
JOIN    other_permissions op
ON      object_id = $object
        AND permission = 'r'
...