Я создаю веб-сайт, в котором я буду управлять пользователями и их полномочиями. Я надеюсь реализовывать пользовательские роли и, может казаться, не переношу голову, как должны работать вещи. Я хочу смочь присвоить пользователю, определенная роль, и иметь каждую роль содержит ту к нескольким полномочиям, которые могут быть прочитаны легко моим сценарием. Просто хочу знать, как я должен пойти об установке моей базы данных, чтобы сделать это легко и эффективно.
В моей голове я таблицы изображения 3 (пользователи, роли и полномочия). Я мог дать каждому пользователю ролевой идентификатор, который присоединяется к ролевой таблице, я просто не знаю, как я могу связать роли с несколькими полномочиями.
Я просто не знаю, как я могу связать роли с несколькими разрешениями. с несколькими разрешениями.
Вы используете таблицу join: role_id и permission_id, чтобы определить, какие разрешения связаны с какими ролями
EDIT:
Примеры таблиц
ROLE Table
Role_ID Role_Name
1 Standard User
2 Super User
3 Guest
PERMISSION Table
Permission_ID Permission_Name
1 View User List
2 Update Own User Account
3 Update Any User Account
ROLE_PERMISSION Table
Role_ID Permission_ID
1 1 // Role 1 (Standard User) grants View User List
1 2 // and Update Own User Account
2 1 // Role 2 (Super User) grants View User List,
2 2 // Update Own User Account,
2 3 // and Update Any User Account
3 1 // Role 3 (Guest) grants View User List
Перечисление разрешений для указанного Role_ID
select R.role_id,
P.permission_id,
P.permission_name
from role R,
permission P,
role_permission RP
where RP.permission_id = P.permission_id
and RP.role_id = R.role_id
and R.role_id = 1
Обычно я делаю вот так:
Вы определяете набор разрешений, значение которых варьируется от целевого объекта к целевому объекту, но общее значение которых одинаково. Например:
Затем вы назначаете бит каждому из них:
class Perms {
const read = 1;
const write = 2;
const append = 4;
const delete = 8;
const deleteContents = 16;
const readPerm = 32;
const changePerm = 64;
/* shortcuts */
const fullControl = 127;
const noControl = 0;
}
Затем для каждого типа объекта у вас есть таблица, в которую вы вставляете пары (пользователь, perms)
, (group, perms)
, (роль, perms)
или все, что вы хотите связать с разрешениями.
Вы можете запросить разрешения пользователя (у которого может быть несколько ролей) следующим образом:
//this will depend on the database
//you could also use whatever bitwise OR aggregate your database has
//to avoid the foreach loop below
$query = new Query(
"select perm from objects_permissions as P ".
"where P.id_object = \$1 and " .
" (P.role = any(\$2));",
$obj->getId(), $user->getRoles()
);
$perms = 0;
foreach ($query as $row) {
$perms |= $row['perm'];
}
Вы также можете добавить запретить разрешения с небольшими трудностями.
Если вы хотите пройти по маршруту трех таблиц, вы можете создать свои таблицы следующим образом:
Table | Rows
User | id ; name ; dob ; permission_id ; etc...
Roles | id ; add_post ; edit_post ; delete_post ; add_user ; etc...
Permissions | id ; user_id ; role_id