ФорумПрограммированиеPHP для идиотов → Управление правами в социальной сети

Управление правами в социальной сети

  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 12 января 2010 г. 1:04, спустя 46 минут 18 секунд

    Расчитываю на плодотворное обсуждение. Что такое «социальная сеть» все представляют. Давайте попробуем создать удобную и простую схему управления правами. В конечном счете это должно выразиться в классах PHP и запросах на SQL, но поначалу давайте обсудим всё абстрактно.
    Надеюсь на участие Абырвалг и adw0rd :) и всех остальных.

    Что такое право:
    Возможность выполнить какое-то действие в заданном контексте. «Субъект» имеет право «сделать» что-то с «объектом».

    Субъект права:
    Это, очевидно, пользователь сайта. Он уже прошел процедуру аутентификации. В данной теме нам неважно как. Считаем, что информация о нём достоверна.

    Объект права:
    Какой-то кусок данных. Например тема дискуссии, фотография, опрос.

    Действие:
    Действие может быть предаставлено как метод класса или как строка-имя действия. Не вдаваясь в детали до поры будем просто писать "create topic" или "upload photograph".

    Иерархия объектов:
    Для социалки вроде Facebook или ВКонтакте типичны «группы». В группе могут быть свои альбомы фотографий, стена, профиль и т.д. Так же как и у отдельного пользователя. Объекты принадлежат либо пользователю, либо группе.
    Можно сказать что группа или личная страница пользователя являются контекстом прав.

    Роли:
    Роль — набор прав в заданном контексте. Один и тот же пользователь выступает в разных ролях в разных контекстах.
    Особая роль — администратор. Он может всё, плюс может назначать роли другим пользователям.

    см. также: Эксперименты с RBAC
    ιιlllιlllι унц-унц
  • Ewg777

    Сообщения: 510 Репутация: N Группа: Джедаи
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 0:38, спустя 1 минуту 24 секунды

    Думаю тут мнение васяца будет кстати
    adw/0
  • Абырвалг

    Сообщения: 6476 Репутация: N Группа: Джедаи

    Spritz 11 января 2010 г. 0:40, спустя 1 минуту 25 секунд

    в Zend_ACL мне не нравится этот пункт http://framework.zend.com/manual/ru/zend.acl.advanced.html#zend.acl.advanced.storing

    Эдво, ты же в Москве.ру принимал участие? как там делали?
    От меня обсуждение будет, как на работу приеду. Сейчас в бурсу уезжаю.
  • adw0rd

    Сообщения: 22905 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 0:53, спустя 13 минут 6 секунд


    Эдво, ты же в Москве.ру принимал участие? как там делали?
    От меня обсуждение будет, как на работу приеду. Сейчас в бурсу уезжаю.

    васяц занимался пользователями/группами и правами для них соответственно
    я занимался сервисами (фото, видео и прочая ерунда)
    Спустя 19 сек.
    поэтому васяц лучше всего сможет рассказать об этом
    adw/0
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 1:35, спустя 41 минуту 43 секунды

    А я пока положу "структуру" группы вконтакте чтобы перед глазами были объекты прав и намеки на действия над ними. (Надо же чем-то руки занять)

    Те блоки, которые Администратор может вкл/выкл.
    Я так понимаю: в процессе такого переключения роли «Участники» и «Гости» получают или теряют право на действие «просмотр ***»
    вкл/выкл.

    Стена
    Фотоальбом
    Видео
    Новости
    Аудиозаписи
    Граффити
    Обсуждения


    Кроме того, отдельные разделы можно пометить как Открытые/Ограниченные. Это приводит к вкл/выкл права «создавать ***» у роли «Участники»
    Открытый/Ограниченный

    Фотоальбомы
    Видео
    Обсуждения
    Доступ

    «Доступ» это особый случай права. Означает возможность перехода из роли «Гости» в роль «Участники» без одобрения администрации.

    Подозреваю что ВКонтакте использует роли Администрация, Участники, Гости и Забаненные. В явном виде администраторы настраивают только некоторые права У. и Г., а в неявном прописано больше всего.
    ιιlllιlllι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 4:32, спустя 2 часа 56 минут 58 секунд

    уверен что вконтакте не заябывали себ мозг этим всем, а делали просто if/неиф. они просто ДЕЛАЛИ :)
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 5:57, спустя 1 час 25 минут 10 секунд

    может быть. но реальные пацаны будут делать все по понятиям.
    ιιlllιlllι унц-унц
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 11 января 2010 г. 11:20, спустя 5 часов 23 минуты 14 секунд


    в Zend_ACL мне не нравится этот пункт http://framework.zend.com/manual/ru/zend.acl.advanced.html#zend.acl.advanced.storing


    Не могу понять, чем не нравиться этот пункт?
    Спустя 53 сек.
    artoodetoo, а действительно, чем не подходит Zend_ACL?
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 11:38, спустя 18 минут 6 секунд

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

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

    помоему для нашей условной социалки можно описать правила попроще, но так, чтобы одним SELECT получить ответ на любой вопрос :)
    ιιlllιlllι унц-унц
  • krasun

    Сообщения: 1370 Репутация: N Группа: Джедаи

    Spritz 11 января 2010 г. 11:50, спустя 11 минут 43 секунды


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

    backend не как не описан, за его реализацию отвечает разработчик


    помоему для нашей условной социалки можно описать правила попроще, но так, чтобы одним SELECT получить ответ на любой вопрос :)

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

    ладно, согласен, сначала надо обсудить требования, а потом посмотрим, подойдет zend_acl или нет, мне уж очень интересно, на что способна эта штука.
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 13: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ι унц-унц
  • phpdude

    Сообщения: 26624 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 14:06, спустя 32 минуты 10 секунд

    круто, читаю с чаем и булочками
    Сапожник без сапог
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 18 января 2010 г. 20: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ι унц-унц
  • artoodetoo

    Сообщения: 5139 Репутация: N Группа: в ухо

    Spritz 11 января 2010 г. 15: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). Иначе список получился бы слишком длинный :)
    Дамп во вложении
    1. qb.sql.zip (46)
    ιιlllιlllι унц-унц

Пожалуйста, авторизуйтесь, чтобы написать комментарий!