Мультисайтинг и права доступа.

Главные вкладки

Аватар пользователя Alex_R Alex_R 23 февраля 2011 в 18:47

Помогите разобраться как правильно это сделать.
Имеем общий контент, доступ к которому определяется некоторым набором правил.
т.е. таблица node_access для каждого сайта своя.
После обновления прав доступа на всех сайтах, все работает как надо, до момента появления нового документа.
Когда на сайте создается новый документ сохраняется в общую базу и в базу этого сайта в таблицу node_access прописывается информация о доступе к данному документу - с этим все понятно. На сайте где документ был создан проблем не возникает.

Вопрос как сделать, чтобы права доступа к этому документу сформировались и на всех остальных сайтах? А то там к нему получается "доступ запрещен"...

Самому видится алгоритм действий примерно такой: На какое нибудь регулярно происходящее событие вешаем код который сравнивает максимальный NID в таблице нод и максимальный NID в таблице node_access и если они не совпадают то перестраиваем права в этом диапазоне. Но вот как это на Друпале оформить правильно пока темный лес. Sad Может кто подскажет, а то не хочется через прямые запросы к базам, когда есть АПИ. И на какое событие это вешать - не на открытие же любого документа?

В итоге вопросы:
1. Как узнать номер последней ноды?
2. Как узнать к какой последней ноде созданы права доступа?
3. Как создать права доступа к определенному диапазону нод?
4. На какое событие лучше всего повесить данный код?
5. Не лучше ли пойти другим путем? (каким?)

Комментарии

Аватар пользователя Alex_R Alex_R 24 февраля 2011 в 10:03

Пока вопросы остаются Sad
1. и 2. - в Друпал 5 была функция db_next_id($name) в 6-ом ее нет, как узнавать id последней записи в таблице?
3. Есть функция node_access_acquire_grants($node) но она входным аргументом требует $node, а у меня есть только $node->nid, и загрузить всю ноду нереально поскольку к самой ноде данному пользователю доступ запрещен.

5. Чем больше пытаюсь разобраться, тем больше мне кажется, что я не в том направлении иду и в Друпале это должно решаться другими средствами... но какими?
Очень надеюсь на помошь, не верю, что с этим никто не сталкивался...
Заранее спасибо!

Аватар пользователя Alex_R Alex_R 24 февраля 2011 в 12:11

"Andruxa" wrote:
У меня в связке Domain Access + ACL + Content Access работает

А какая механика работы в этой связке в отношении таблицы node_access?
Она для каждого сайта своя?
В какой момент происходит ее заполнение на всех сайтах при создании нового документа на одном из сайтов?

Аватар пользователя Andruxa Andruxa 24 февраля 2011 в 23:57

Для разных доменов (поддоменов) можно настроить свои таблицы.
На поддоменах - копии таблицы users_roles с префиксами domain_id_
Настраивается по адресу /admin/build/domain/prefix/[did]

Соответственно, на одном домене юзер может быть site admin, а на остальных - authenticated user.

Аватар пользователя Alex_R Alex_R 25 февраля 2011 в 8:57

Andruxa wrote:
Для разных доменов (поддоменов) можно настроить свои таблицы.
На поддоменах - копии таблицы users_roles с префиксами domain_id_
Настраивается по адресу /admin/build/domain/prefix/[did]

Соответственно, на одном домене юзер может быть site admin, а на остальных - authenticated user.


Это понятно, это и у меня можно сделать. С ролями вообще никаких проблем нет, однако требуется помимо управления по ролям еще и управление по материалам, Чтобы например модератор на одном сайте мог сделать документ созданный на другом сайте видимым на этом сайте или нет, но не имел права его редактировать.
Вопрос реально ли сделать так, чтобы одному и тому же пользователю (не автору документа) на одном сайте была возможность смотреть, редактировать и удалять материал, на втором смотреть и редактировать, на третьем только смотреть, а на четвертом ему доступ был бы запрещен? И чтобы эти права создавались автоматически для каждого документа на каждом сайте в зависимости от того, кем данный документ был создан, на каком сайте он был создан и т.д (т.е. чтобы при создании прав доступа отрабатывал собственный скрипт)...
Если это реально то пойду изучать как там это реализовано, просто поставить подобную тестовую сборку у меня пока проблема...

Аватар пользователя Andruxa Andruxa 25 февраля 2011 в 10:22

"Alex_R" wrote:
на одном сайте была возможность смотреть, редактировать и удалять материал, на втором смотреть и редактировать, на третьем только смотреть, а на четвертом ему доступ был бы запрещен?

Ну, это 4 разные роли.

Content Aceess + ACL позволяет делать шаблоны прав для разных типов материала.
Соответственно, при создании материала он наследует права из шаблона, а потом каждой отдельной ноде можно переопределить эти права - хоть по ролям, хоть по юзерам индивидуально.

Аватар пользователя Alex_R Alex_R 25 февраля 2011 в 10:44

Объясняю чтобы было понятнее.
Как минимум мне надо, чтобы к связке "Роль" - "Тип материала" добавился третий параметр - "сайт создания".

Например "Роль 1" имеет право на сайте "А" редактировать "новость" сознанную на сайте "А" и "В", но не имеет право редактировать "новость" созданную на сайте "С" и не может просматривать "новость" созданную на сайте "D". Такое возможно при использовании Domain Access + ACL + Content Access?