Правильный способ управления пользовательскими привилегиями (пользовательская иерархия) - PullRequest
1 голос
/ 25 октября 2009

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

Моя идея состоит в том, чтобы иметь отдельную таблицу PRIVILEGES, например:

+-----------------+--------+
|privilege        |  value |
+-----------------+--------+
|create sub users |    1   |
|edit own profile |    2   |
|add new site     |    3   |
|delete site      |    4   |
+-----------------+--------+

Затем, когда основной пользователь выбирает привилегии, обновите столбец привилегий суб-пользователей значением, например:

+--------------+-----------+
|user_id       | privilege |
+--------------+-----------+
|user_1        |     4     | 
|user_2        |     2     |
|user_3        |     1     |
|user_4        |     2     |
+--------------+-----------+

Но значения не дают уникальных сумм. Например:

privileges
1 -> create sub users
+
2 -> edit own profile
= privilege 3 (create sub users, edit own profile)

но есть и другая привилегия для значения 3 (добавить новый сайт), так что это не будет работать.

Итак, мой вопрос: как сделать любую возможную комбинацию привилегий уникальной?

Есть ли более разумный способ управления привилегиями?

1 Ответ

5 голосов
/ 25 октября 2009

Если вы хотите сохранить это как один столбец, используйте base 2 заполнители.

1 - represents priv 1
2 - represents priv 2
4 - represents priv 3
8 - represents priv 4
16 - represents priv 5
32 - represents priv 6

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

Так ..

3 = priv 1 and priv 2
9 = priv 1 and priv 4

63 = all privs.

и т. Д.

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

РЕДАКТИРОВАТЬ: Если вы все еще хотите использовать один столбец для хранения priv, добавьте еще один столбец, в котором хранятся, кто дал разрешение.

Но ... Я бы по-прежнему предлагал хранить каждую привилегию отдельно. Создайте таблицу с объединенным первичным ключом для priv, user_id и grantor . Объединенный первичный ключ обеспечит уникальность каждого priv, поэтому вам не нужно проверять его перед вставкой. Чтобы создать комбинированный первичный ключ:

ALTER TABLE priv ADD PRIMARY KEY (user_id,grantor,priv_id);

Затем добавить или сбросить прив, REPLACE INTO priv (user_id,grantor,priv_id) VALUES (?,?,?)

Чтобы удалить привилегию для пользователя, DELETE FROM priv WHERE user_id = ? AND priv_id = ?

Чтобы удалить все привилегии для пользователя, DELETE FROM priv WHERE user_id = ?

Чтобы удалить всех суб-пользователей для лица, предоставляющего право ... DELETE FROM priv WHERE grantor = ?

Получение всех привилегий для пользователя в лице лица, предоставляющего право: SELECT * FROM priv WHERE user_id = ? AND grantor = ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...