Форум → Программирование → PHP для идиотов → Управление правами в социальной сети
Управление правами в социальной сети
-
12 января 2010 г. 12:04, спустя 46 минут 18 секунд
Расчитываю на плодотворное обсуждение. Что такое «социальная сеть» все представляют. Давайте попробуем создать удобную и простую схему управления правами. В конечном счете это должно выразиться в классах PHP и запросах на SQL, но поначалу давайте обсудим всё абстрактно.
Надеюсь на участие Абырвалг и adw0rd :) и всех остальных.
Что такое право:
Возможность выполнить какое-то действие в заданном контексте. «Субъект» имеет право «сделать» что-то с «объектом».
Субъект права:
Это, очевидно, пользователь сайта. Он уже прошел процедуру аутентификации. В данной теме нам неважно как. Считаем, что информация о нём достоверна.
Объект права:
Какой-то кусок данных. Например тема дискуссии, фотография, опрос.
Действие:
Действие может быть предаставлено как метод класса или как строка-имя действия. Не вдаваясь в детали до поры будем просто писать "create topic" или "upload photograph".
Иерархия объектов:
Для социалки вроде Facebook или ВКонтакте типичны «группы». В группе могут быть свои альбомы фотографий, стена, профиль и т.д. Так же как и у отдельного пользователя. Объекты принадлежат либо пользователю, либо группе.
Можно сказать что группа или личная страница пользователя являются контекстом прав.
Роли:
Роль — набор прав в заданном контексте. Один и тот же пользователь выступает в разных ролях в разных контекстах.
Особая роль — администратор. Он может всё, плюс может назначать роли другим пользователям.
см. также: Эксперименты с RBACιιlllιlllι унц-унц -
11 января 2010 г. 11:37, спустя 23 часа 33 минуты 1 секунду
-
11 января 2010 г. 11:38, спустя 1 минуту 24 секунды
Думаю тут мнение васяца будет кстатиhttps://smappi.org/ - платформа по созданию API на все случаи жизни -
11 января 2010 г. 11:40, спустя 1 минуту 25 секунд
в Zend_ACL мне не нравится этот пункт http://framework.zend.com/manual/ru/zend.acl.advanced.html#zend.acl.advanced.storing
Эдво, ты же в Москве.ру принимал участие? как там делали?
От меня обсуждение будет, как на работу приеду. Сейчас в бурсу уезжаю. -
11 января 2010 г. 11:53, спустя 13 минут 6 секунд
Эдво, ты же в Москве.ру принимал участие? как там делали?
От меня обсуждение будет, как на работу приеду. Сейчас в бурсу уезжаю.
васяц занимался пользователями/группами и правами для них соответственно
я занимался сервисами (фото, видео и прочая ерунда)Спустя 19 сек.поэтому васяц лучше всего сможет рассказать об этомhttps://smappi.org/ - платформа по созданию API на все случаи жизни -
11 января 2010 г. 12:35, спустя 41 минуту 43 секунды
А я пока положу "структуру" группы вконтакте чтобы перед глазами были объекты прав и намеки на действия над ними. (Надо же чем-то руки занять)
Те блоки, которые Администратор может вкл/выкл.
Я так понимаю: в процессе такого переключения роли «Участники» и «Гости» получают или теряют право на действие «просмотр ***»
вкл/выкл.
Стена
Фотоальбом
Видео
Новости
Аудиозаписи
Граффити
Обсуждения
Кроме того, отдельные разделы можно пометить как Открытые/Ограниченные. Это приводит к вкл/выкл права «создавать ***» у роли «Участники»
Открытый/Ограниченный
Фотоальбомы
Видео
Обсуждения
Доступ
«Доступ» это особый случай права. Означает возможность перехода из роли «Гости» в роль «Участники» без одобрения администрации.
Подозреваю что ВКонтакте использует роли Администрация, Участники, Гости и Забаненные. В явном виде администраторы настраивают только некоторые права У. и Г., а в неявном прописано больше всего.ιιlllιlllι унц-унц -
11 января 2010 г. 15:32, спустя 2 часа 56 минут 58 секунд
уверен что вконтакте не заябывали себ мозг этим всем, а делали просто if/неиф. они просто ДЕЛАЛИ :)Сапожник без сапог -
11 января 2010 г. 16:57, спустя 1 час 25 минут 10 секунд
может быть. но реальные пацаны будут делать все по понятиям.ιιlllιlllι унц-унц -
11 января 2010 г. 22:20, спустя 5 часов 23 минуты 14 секунд
в Zend_ACL мне не нравится этот пункт http://framework.zend.com/manual/ru/zend.acl.advanced.html#zend.acl.advanced.storing
Не могу понять, чем не нравиться этот пункт?Спустя 53 сек.artoodetoo, а действительно, чем не подходит Zend_ACL? -
11 января 2010 г. 22:38, спустя 18 минут 6 секунд
может быть подходит. я с другого конца начинаю — сначала надо описать требования, а потом смотреть какие возможны решения. сходу мне кажется, что ACL слишком крут :)
по ссылке Абырвалг написано, что backend для хранения в базе никак не описан, но можно сохранять сериализованную версию. по сериализованным данным не сделать SQL запрос. значит всякий раз надо подгружать правила в скрипт чтобы что-то проверить.
помоему для нашей условной социалки можно описать правила попроще, но так, чтобы одним SELECT получить ответ на любой вопрос :)ιιlllιlllι унц-унц -
11 января 2010 г. 22:50, спустя 11 минут 43 секунды
по ссылке Абырвалг написано, что backend для хранения в базе никак не описан, но можно сохранять сериализованную версию. по сериализованным данным не сделать SQL запрос. значит всякий раз надо подгружать правила в скрипт чтобы что-то проверить.
backend не как не описан, за его реализацию отвечает разработчик
помоему для нашей условной социалки можно описать правила попроще, но так, чтобы одним SELECT получить ответ на любой вопрос :)
с Zend_ACL тоже можно также реализовать, просто необязательно загружать все данные из базы, все права, роли и ресурсы, достаточно создать acl к примеру для данной роли и для ресурса.
ладно, согласен, сначала надо обсудить требования, а потом посмотрим, подойдет zend_acl или нет, мне уж очень интересно, на что способна эта штука. -
12 января 2010 г. 0:33, спустя 1 час 43 минуты 32 секунды
Требование 1:
В любом контексте "C" пользователю "U" соответствует какая-то одна Роль "R" (т.е. набор прав).
Являюсь ли я участником группы «Beatles»? Вася друг Маши?
C & U => R
Можно было бы придумать, что пользователь может выступать одновременно в нескольких ролях в одном контексте, только мне кажется здесь нет в этом необходимости. Поэтому чем проще, тем лучше.
Требование 2:
Можно получить ответ на вопрос «есть ли право на действие "A" у роли "R" в контексте "C"?» для любой тройки C, A, R.
Договоримся, что если правило не описано явно, значит такого права у роли нет. Если описано, значит есть право. Предельно просто.
Могу ли я создать тему в группе «Убей бобра»? Да/Нет
R & C => {A}
C & A & R => Yes/Not
Требование 3:
Для любого пользователя можно получить ответ на вопрос «в каких контекстах "C" пользователь "U" выступает в роли "R"?»
В каких группах я состою? А где я Админ?
U & R => {C}
Требование 4:
Для любого действия можно получить ответ на вопрос «в каких контекстах пользователь "U" имеет право на действие "A"?»
В каких группах и у каких пользователей я могу смотреть фотографии? Полезный вопрос для создания новостной ленты.
U & A => {C}ιιlllιlllι унц-унц -
12 января 2010 г. 1:06, спустя 32 минуты 10 секунд
круто, читаю с чаем и булочкамиСапожник без сапог -
19 января 2010 г. 7:50, спустя 7 дней 6 часов 44 минуты
Сейчас начнется самоестрашноеглавное. Попробую описать сущности в SQL (MySql)
Контекст. Это может быть пользователь или группа.
CREATE TABLE `x_contexts` (
`cont_id` int(10) NOT NULL auto_increment,
`short_name` varchar(20) NOT NULL default '',
`full_name` varchar(100) NOT NULL default '',
`is_team` tinyint(1) NOT NULL default '0',
`creator_id` int(10) default NULL,
PRIMARY KEY (`cont_id`),
UNIQUE KEY (`short_name`)
);
на префикс "x_" можно не обращать внимание, я копирую из myphpadmin и мне лениво отрезать что-то.
Поле is_team позволят определить является ли контекст группой.
Пользователи вступают в отношения с другими пользователями и группами. То есть выступают в какой-то роли.
Роль
CREATE TABLE `x_roles` (
`role_id` INT(10) NOT NULL AUTO_INCREMENT ,
`short_name` VARCHAR(20) NOT NULL ,
`full_name` VARCHAR(100) NOT NULL ,
PRIMARY KEY (`role_id`) ,
UNIQUE (`short_name`)
);
Назначенные Роли.
CREATE TABLE `x_relations` (
`cont_id` INT( 10 ) NOT NULL ,
`user_id` INT( 10 ) NOT NULL ,
`role_id` INT( 10 ) NOT NULL ,
PRIMARY KEY ( `cont_id` , `user_id` , `role_id` )
);
здесь поля cont_id и user_id ссылаются на ключи одной и той же таблицы contexts
Роль описывает набор прав в контексте.
CREATE TABLE `x_rights` (
`cont_id` INT(10) NOT NULL ,
`role_id` INT(10) NOT NULL ,
`act_id` INT(10) NOT NULL ,
PRIMARY KEY (`cont_id` , `role_id` , `act_id`)
);
здесь упоминаются действия
CREATE TABLE `x_actions` (
`act_id` int(10) NOT NULL auto_increment,
`short_name` varchar(20) NOT NULL default '',
`full_name` varchar(100) NOT NULL default '',
PRIMARY KEY (`act_id`),
UNIQUE KEY (`short_name`)
);
Итого:
- описываем назначенные пользователям Роли в Контексте через таблицу отношений (relations).
- Роль — это набор Прав (rights) в Контексте
Таблицы contexts, roles и actions — это справочники из которых мы извлекаем имена. Для контроля прав они неважны. Реальная работа строится через relations и rights.
Тонкий момент: если пользователю в я вном виде не назначена роль для некоего контекста, то должна использоваться роль по-умолчанию. В MySql это можно выразить через LEFT JOIN и ifnull(). Ниже я приведу примеры.ιιlllιlllι унц-унц -
12 января 2010 г. 2:47, спустя 18 часов 57 минут 16 секунд
Заполняем таблицы игровыми данными:
contexts
cont_id short_name full_name is_team creator_id
1 guest Unregistered user 0 NULL
2 durov Первопользователь. Обычно выступает в роли Бога. 0 NULL
3 john John Doe 0 NULL
4 mary Mary Christmas 0 NULL
5 bobrdobr Убей бобра 1 2
6 photo-moto Фотолюбители 1 3
7 ivanov И. Иванов 0 NULL
8 petrov П. Петров 0 NULL
здесь две группы (is_team=1)
roles
role_id short_name full_name
1 visitors Прохожие
2 members Участники
3 admins Администраторы
actions
act_id short_name full_name
1 blog-view Читать блог
2 blog-post Писать в блог
3 photo-view Смотреть фотки
4 photo-post Выкладывать фотки
5 team-join Вступить в группу
relations
cont_id user_id role_id
5 2 3
5 4 2
5 7 2
6 3 3
6 7 2
6 8 2
rights
cont_id role_id act_id
5 1 1
5 1 3
5 1 5
5 2 1
5 2 2
5 2 3
5 2 4
5 3 1
5 3 2
5 3 3
5 3 4
6 2 1
6 2 2
6 2 3
6 2 4
6 3 1
6 3 2
6 3 3
6 3 4
Права я описал только для групп (id=5,6). Иначе список получился бы слишком длинный :)
Дамп во вложенииιιlllιlllι унц-унц
Пожалуйста, авторизуйтесь, чтобы написать комментарий!