1

Тема: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

На даний момент я створюю самописний форум на основі KohanaFramework.
В якості самоосвіти, пробую створити досить складний проект, де буде багато різних налаштувань, зокрема і по правам доступів.

В зв'язку із цим в мене питання до тих, хто сам реалізовував складні проекти. Як краще організовувати перевірку прав доступів. Заплановано реалізувати і ролі, і окремі права. Перше, що спадає на думку - зробити таблицю, в якій буде ідентифікатор користувачів, та ідентифікатор відповідного об'єкта, а також визначені конкретні права (insert, update, delete...).

Але якщо це буде одна таблиця, то при збільшенні в ній записів до десятків тисяч, вона буде досить "важкою" для роботи форума. Це по-перше, ну а по друге - більшість тем мабуть все ж будуть доступними для всіх користувачів і вносити їх всіх в таблицю доступів немає сенсу. Тобто якось треба спочатку перевіряти чи дана тема видима для всіх, і якщо ні, то перевіряти хто саме має на це право. Для цього мабуть треба використовувати окрему таблицю...

Як я і написав в назві теми - бажано не просто оптимізувати велику кількість дозволів, а ще й дати можливість визначати права строго через адмінку (а не через код програми). Доречі цікаво чи прийнято через адмінку встановлювати налаштування, які будуть записані не в БД, а у файл.

2

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Скористайтеся файловою моделлю *NIX (скорегованою для ваших потреб). В *NIX у кожного файла є:
- власник;
- права власника (3 пункти);
- група;
- права групи (3 пункти);
- права решти (3 пункти).
3 пункти - це булеві значення дозволів читати, писати і виконувати. Кожен користувач може належати до кількох груп. Ну от, власне, і все, перевірка відбувається приблизно так (псевдокод):

function GetPermission( User, Object, Action )
  if ( User == Object.Owner ) 
    return Object.OwnerPermisions[ Action ];
  else if ( Object.Group in User.Groups )
    return Object.GroupPermisions[ Action ];
  else return Object.OtherPermisions[ Action ];

Примітивна, але дієва система. Вам замість цих трьох пунктів доведеться скласти свій список, але жодних проблем не бачу.
Стосовно методу запису - то дані БД потім також пишуться у файл, так що жодних проблем не бачу.

3

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Треба також визначитись з структурою, якщо тема доступна для всіх а розділ відкритий тільки для модераторів то скоріш за все тільки модератори можуть переглядати теми в даному розділі.

Один з варіантів:
у кожній темі ми прописуємо набір прапорців. Наприклад 16-rw (група з номером 16 може читати і видаляти писати повідомлення
18-rd (група 18 може видаляти повідомлення і так дальше)

Виберіть що у вас саме більше повторяється (які права) і зробіть їх по замовчуванні ;)

4

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Дякую колеги, але я хочу створювати не статичні сторінки і каталоги, а віртуальні. Мабуть в такому разі права *NIX доступів не прокатять. Так же?

5

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Ще раз: я не кажу використовувати права файлів, я кажу створити аналог таких прав для ваших ресурсів. До речі, дійсно, можна права користувача для спрощення викинути, тільки права груп.

6

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Ми маємо на увазі не для файлів використовувати права а саму технологія (підхід)

Я реалізував би це так.
А. Кожен користувач належить до певної групи
Б. Користувач може мати інші права звязані з темою відмінні від групи.

Тобто ви або задаєте права на тему для груп, або для конкретного користувача.

1. Задаємо права для групи
Вказали які групи можуть читати, створювати і видаляти повідомлення у певних темах
2. Вказуємо що ось цей користувач може бачити і редагувати дану тему.

Тоді логіка перевірки наступна.
1. Перевіряємо чи користувач може виконувати дану дію - якщо так тоді все ок, якщо ні - ідемо до пункту 2
2. Перевіряємо чи група у яку належить користувач, може виконувати дану дію. Якщо так - тоді все ок, якщо ні - доступ заборонено

Все залежить від ваших особливостей. Якщо ви хочете зробити супер пупер гнучкі права тоді це оптимальний спосіб але досить громіздкий. (Якщо кількість гурп буде 10, а там 200 треба буде мати матрицю 10*200 , якщо ви для 1500 користувачів хочете задати якісь особливі права то будете довго цокати, але все таки зможете налаштувати ;)

Доречі цікаво чи прийнято через адмінку встановлювати налаштування, які будуть записані не в БД, а у файл.

Краще в бд все таки писати, але можна і у файл;)

Декілька питань:
1. Яка кількість груп може бути у вас на форумі (від і до )
2. Який перелік дій може бути у вас на форумі (читати, створювати, редагувати, скаржитись і тд...)

7

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Головне питання не в тому які опції можна буде проставити для користувача, для груп, для решти. Головне як реалізовувати перевірку будь-яких прав, враховуючи, що користувачів може бути десятки тисяч, і кожен з них може мати десятки чи й сотні прав в залежності від підписок на різні теми, причому для кожної теми права можуть бути різними (view, insert, update,delete...).

Підхід який є у *nix системах можна реалізувати, якщо кожен об'єкт матиме властивості, де можна прописати ці права. А тепер, увага, питання - Як це зробити? Створювати аналог властивостей для кожної окремої теми, та записувати туди всі ці права? Мабуть десятки тисяч таблиць, це буде...

Короче думаю, що треба АБО робити звичайні ролі/права, які є на більшості форумів і не паритись з реалізацією задуманого форума-монстра, АБО все-таки створювати всі ці множинні опції складати їх в одну-дві таблиці і просто оптимізовувати запити в БД до них.

8

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

А ви спробуйте намалювати ERD - і побачите, що таблиць додасться не так вже й багато.

9 Востаннє редагувалося ktretyak (11.03.2014 18:13:03)

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Я оце зараз подумую чи не серіалізувати просто масив доступів кожного користувача і чи не вставити його потім в окреме поле в таблиці користувачів.
Переваги - не потрібно створювати окремі таблиці, які можуть мати дуже велику кількість записів.
Недолік - якщо користувач матиме велику кількість різних доступів, то "тягання їх за собою" відповідно зменшуватиме оперативку. Ну і відновлювати цей масив а потім парсити теж ресурсоємна справа. Хоча... скільки там кожен користувач матиме тих доступів, можливо максимум пару сотень.
Спробую

10

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Недолік - якщо користувач матиме велику кількість різних доступів, то "тягання їх за собою" відповідно зменшуватиме оперативку.

це мені здається гірший варіант ніж таблиця з індексованими полями ;)

Подякували: koala1

11 Востаннє редагувалося ktretyak (11.03.2014 18:58:44)

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Та да, облом досить швидко прийшов, коли я подумав, наприклад, про виведення списку всіх тем, до яких користувач має доступ. І в разі коли притримуватись ідеї "всі доступи в одному масиві", то я уявляю скільки треба буде проставити

OR WHERE permission_view_theme in(1, 2, 3 ...)
...

Повертаюсь назад до таблиць =)

12

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

Одна таблиця - групи користувачів. Друга таблиця - дозволи груп в ресурсів. Що тут важкого чи складного?

13

Re: Як оптимізувати велику кількість дозволів, використовуюч адмінку сайта

koala написав:

Одна таблиця - групи користувачів. Друга таблиця - дозволи груп в ресурсів. Що тут важкого чи складного?

Так, якщо дотримуватись ваших рекомендацій, що роздавати права лише групам, а не конкретним користувачам, то і записів буде значно менше...
Я поки що вагаюсь