Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разграничение прав, CMS 
:(
    Опции темы
CyClon
Дата 30.4.2008, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



А давайте-ка поговорим о наиболее оптимальном варианте системы авторизации / разграничения прав на сайте (в теоретическом плане, т.е. алгоритм, примеры кода можете оставить при себе smile)?

Думал об этом недавно и решил вот узнать, что думают по этому поводу другие.

Итак, мы имеем сайт, который состоит из модулей (новости, контент, файловый архив). Так же мы имеем 4 основных группы пользователей - забаненые, гости, пользователи, администаторы + доп. группы (напр. "Клиенты", "Support", etc). На сайте находится n-ое количество страниц, генерируемых модулями и i-ое количество зарегистрированных пользователей. Задача - связать это все в одну систему разграничения прав, которая зашивается в ядро CMS (ибо модулем это будет выглядеть как-то не так).

Как решить задачку-то?

1. Каждая группа имеет свои права (забаненые - самые низкие, администраторы - самые высокие, остальные - промежуточные значения).
2. Каждый пользователь принадлежит к какой либо группе (забаненный, гость, пользователь, администратор или др.).
3. Каждый пользователь имеет свои уникальные права, если они не заданы или менее приоритетные чем у группы, используются права группы.
4. Каждый модуль сайта имеет свой уровень доступа, т.е. страницы модуля могут просматривать только пользователи групп с соответствующими правами. Плюс ко всему каждая страница имеет свой уровень доступа, если же он не задан - используется уровень доступа модуля, которым она генерируется.

Все вроде бы неплохо получается, только вот у меня не получается продумать связь прав пользователей с уровнями доступа модулей. При каких значениях модуль доступен пользователю, при каких нет. Можно прописать цифрами (0 - ничего, 1 - просмотр, 2 - просмотр и редактирование) уровни доступа для каждой группы, но ведь количество групп постоянно меняется. В общем, тут я совсем запутался и кроме как сделать уровни доступа а-ля 0, 10, 20, 30 ничего не придумал (страница имеет уровень доступа, если права >= уровню, то просмотр возможен). Здесь и хочется выслушать ваши мысли smile

В общем, нужны идеи по организации базы данных. Получается, что у нас имеются таблицы: members (id, gid, name, privileges), groups(id, name, privileges), modules(name, privileges).

Go мысли вслух smile


--------------------
user posted image
PM   Вверх
Daevaorn
Дата 30.4.2008, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: нет
Всего: 70



Права лучше идентифицировать по кодам. "news:write", "article:delete" и т.п. Соответсвенно, базовые права для модулей: добавление, редактирование и удаление - создаются автоматически при добавлении модуля. Так же они присваиваются главному админу. А он их потом раздает всем кому надо, т.е. как группам так и отдельным пользователям.
PM MAIL WWW   Вверх
masp
Дата 30.4.2008, 19:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 34
Регистрация: 22.2.2007

Репутация: нет
Всего: 2



Цитата(Daevaorn @ 30.4.2008,  17:53)
Права лучше идентифицировать по кодам. "news:write", "article:delete" и т.п. Соответсвенно, базовые права для модулей: добавление, редактирование и удаление - создаются автоматически при добавлении модуля. Так же они присваиваются главному админу. А он их потом раздает всем кому надо, т.е. как группам так и отдельным пользователям.

write, delete - это просто слова или это хранится по айдишникам в отдельной таблице ?*
PM MAIL ICQ   Вверх
CyClon
Дата 30.4.2008, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: нет
Всего: 4



Да я думаю это не важно, просто как я понял, нужно хранить права в строке, где будет нечто "news=2|content=1" и т.д. Строка парсится и уже через if-else выруливается все.

Еще какие предложения будут?


--------------------
user posted image
PM   Вверх
ksnk
Дата 30.4.2008, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



Цитата(CyClon @  30.4.2008,  18:44 Найти цитируемый пост)
идеи по организации базы данных

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

imho, права - отдельный объект, однако для определенности можно именовать его массивом ;-) У каждого юзера-группы свой массив прав. Нужно, правда придумать способ склейки всех 'наследуемых' прав в один массив.
Массивы достаточно удобно сериализовать...

А как-же без кода? ;-)
Код

define(right_NOTHING,0);
define(right_READ,1);
define(right_WRITE,2);
...
define(right_ADMIN,1024);
define(right_BANNED,2048);
...
$user->set_right(array('all'=>right_NOTHING,'news'=>right_READ,'spam'=>right_READ+right_WRITE));
...
if($user->has_right('news', right_READ)) {
  // вывод блока news...
}



--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
Fortop
Дата 30.4.2008, 21:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Каждый модуль/объект/страница - любая сущность имеет список действий которые над ней можно совершить.
чтение/создание/редактирование/удаление.
Отсюда и танцуешь.

Таблица возможных действий для каждого объекта (например, технический лог можно только записывать, прочесть нельзя, какие бы там у кого права не стояли).
Если не установлены он наследует от родителя. Если вообще ничего не стоит, то все возможности доступны.
objects_actions (id, select, insert, update, delete)

Таблица прав групп/пользователей
member_rights (id, select, insert, update, delete, oid)

Для действий по умолчанию в objects - создаешь корневую запись где все разрешено/запрещено (это зависит от идеологии ресурса, я бы выбрал первый вариант).

Для прав по умолчанию в members - создаешь корневую запись, где все действия запрещены/разрешены (это зависит от идеологии ресурса, я бы выбрал первый вариант)

И собственно все.

Да, отдельно может быть таблица объектов.
И отдельно таблица участников (группа - это тоже участник, просто содержащий других участников).
тут все просто
objects, members (id, pid, name, somethingelse). Отличия в структурах допишешь сам, какие тебе нужны.

Когда проверяем права, выбираем, для начала, состояние ВОЗМОЖНЫХ действий над объектом (если их нет для него, берем родительские и т.д. вверх до самого корня), затем состояние прав по-умолчанию, затем групповых прав, и в конце персональных прав.
Над всеми разрешениями производим операцию ЛОГИЧЕСКОЕ И.
Т.е. если запрещено для группы, то, чтобы там не стояло для пользователя - ему запрещено тоже.

Можно усложнить схему, для случая, когда пользователь состоит в разных группах одновременно. Тогда для групп можно расставить ранг/вес. И соответственно браться разрешения будут из группы с наибольшим рангом.


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
source777
Дата 30.4.2008, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

Репутация: нет
Всего: 56



Цитата(ksnk @  30.4.2008,  21:45 Найти цитируемый пост)
Нужно, правда придумать способ склейки всех 'наследуемых' прав в один массив.
Да уж, давно придумали: логическое "или" называется. smile ну и соответственно: нет доступа - 0, чтение - 1, добавление- 2, редактирование/удаление - 4. 



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
ksnk
Дата 30.4.2008, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 1
Всего: 386



source777, Я там упростил... по уму должно быть right_READ=1 и right_DENY_READ=4... Вот теперь интереснее?


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
awers
Дата 6.5.2008, 01:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник
Сообщений: 1465
Регистрация: 22.3.2006
Где: Россия, Таганрог

Репутация: нет
Всего: 31



Хм. А чем Zend ACL не катит? 
И вообще, у каждого объекта CMS должен быть ID
PM MAIL WWW ICQ Skype   Вверх
solenko
Дата 6.5.2008, 01:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 2
Всего: 67



awers, не катит ка минимум потому, что является частью фреймверка.

All, в дествительности, все своидтся к общему слчяаю ACL, которая упрощается под текущую задачу. Если взглянуть на задачу топикстартера, то это оно и есть. Ну а дельше... 
1. Посмотреть распределение прав в известных CMS и фреймверках
2. Посмотреть standalone реализации. Например тут

Это сообщение отредактировал(а) solenko - 6.5.2008, 01:58


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
PHPExpert
Дата 13.5.2008, 13:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.5.2008
Где: Москва

Репутация: нет
Всего: нет



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

Модуль Articles.
read - чтение элемента
new - создание нового элемента
active/deactive - активация / деактивация (отображение на внешней части сайта)
edit -  редактирование

Нужны 2 таблицы 1-я с группами юзеров, 2-я с самими юзерами.
Права присваиваются группе юзеров.

Как происходит присвоение прав группе.
1. Выбираем набор общих действий галочками RNAE (read [0 или 1], new [0 или 1], active [0 или 1], edit [0 или 1])
2. Выбиаем модули к которым есть доступ у группы.
3. Выбираем доступ к каким-либо уникальным в рамках конкретного модуля действиям (к примеру, очистить статистику, переиндексировать содержимое и т.п.).

Само собой при создании модулей, нужно создавать список действий, которые можно поизвести над модулем.

Всё намного сложнее, но я реализовывал данную схему в ЦМС и она прекрасно работает и справляется со всеми задачами.

Это сообщение отредактировал(а) PHPExpert - 13.5.2008, 13:48
PM MAIL WWW ICQ   Вверх
solenko
Дата 13.5.2008, 14:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 2
Всего: 67



PHPExpert, а как она управляется с правами на уровне еденицы контента? ;)


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Fortop
Дата 13.5.2008, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2200
Регистрация: 13.11.2007
Где: Донецк

Репутация: 1
Всего: 42



Цитата(PHPExpert @  13.5.2008,  13:46 Найти цитируемый пост)
Нужны 2 таблицы 1-я с группами юзеров, 2-я с самими юзерами.

А в чем разница между группой и юзером? smile


--------------------
Мир это Я.
Живее всех живых.
PM MAIL   Вверх
PHPExpert
Дата 14.5.2008, 13:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 13.5.2008
Где: Москва

Репутация: нет
Всего: нет



> PHPExpert, а как она управляется с правами на уровне еденицы контента? ;) 

Единица контента принадлежит какому-либо юзеру, который её создавал, юзер принадлежит определённой группе.
Ведь зачем нам назначать права к элементам как в линуксе? Как хранить тогда эти права?
Давайте абстрагируемся от этого представления и рассмотрим на примере несколько другой подход.
У веба какая основная задача? Создать институт контенщиков, модераторов и админов.

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

Права для группы admin модуль articles
--------------------------------------------------------------------
read:1, new:1, edit:1, active:1, delete: 1
далее идёт список всех существующих групп с галочками, если галочка стоит, то данные выше права могут распространиться на выбранные группы
[О] admin
[О] moderator
[О] contenter
[Х] all
--------------------------------------------------------------------
и т.д. для всех модулей системы

Права для группы moderator и модуля articles
--------------------------------------------------------------------
read:1, new:0, edit:1, active:1, delete: 1
[О] admin
[О] moderator
[Х] contenter
[О] all
--------------------------------------------------------------------
и т.д. для всех модулей системы

Права для группы contenter и модуля articles
--------------------------------------------------------------------
read:1, new:1, edit:1, active:0, delete: 1
[О] admin
[О] moderator
[O] contenter
[О] all
Если не выбрана ни одна группа, то всё можно делать только над записями, которые созданы самостоятельно, т.е. под конкретным юзернеймом
+ active по умолчанию 0 (выводить на сайт или нет) и его может поменять только модератор или админ.
--------------------------------------------------------------------
и т.д. для всех модулей системы

В приведённом мною примере, можно всё упростить тем, что сделать общие галочки для сходных действий модулей.
Например, выделить во всех модулях весь read и т.п.

А ещё, нужно не забыть, что в системе могут быть несколько сайтов!!! smile

В общем, ещё много много ньюансов с этим, все писать просто нет сил...

> А в чем разница между группой и юзером? smile 
В группе может быть сотня юзеров и нет никакого смысла вязать права конкретному юзеру
(это относится только к моему методу присвоения прав)
PM MAIL WWW ICQ   Вверх
solenko
Дата 14.5.2008, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1473
Регистрация: 15.1.2006
Где: Украина

Репутация: 2
Всего: 67



PHPExpert, вы меня не поняли. Два простых примера:
1. На этом форуме есть закрытые разделы, доступные только избранным.
2. Я хочу создать фотку, которая будет доступна для просмотра только пользователям, которые записаны ко мне в друзья

По вашей же система пользователь/группа может или смотреть или не смотреть ВСЕ фотки.


--------------------
Ла-ла-ла-ла
Заметьте, нет официального подтверждения, что это не просто четыре слога.
PM MAIL WWW ICQ Skype   Вверх
Ответ в темуСоздание новой темы Создание опроса

Внимание: данный раздел предназначен для решения сложных, нестандартных задач.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Для профи | Следующая тема »


 




[ Время генерации скрипта: 0.0603 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.