Алгоритм доступа к сущности на основе доступа к родительской сущности

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

Аватар пользователя vlucas vlucas 14 марта 2019 в 16:28

Посоветуйте с алгоритмом доступа:

1.Есть сущность - верхнего уровня, к ней определён доступ пользователя.
2.Есть дочерняя промежуточная сущность и есть дочерняя сущность у промежуточной.
3.В общем есть иерархия через entity_reference этого всего.

Вопрос: как мне лучше всего организоваьт проверку доступа к дочерним сущностям на основе доступа к самой верхней? Может есть что-то готовое?

Комментарии

Аватар пользователя Orion76 Orion76 14 марта 2019 в 21:29
1

Задачка очень не стандартная, поэтому предположу, что готовое решение врядли имеется.
Как я понял, в Вашем случае связь один-к-одному, т.к. дочерняя сущность может принадлежать только одному родителю (чтобы наследовать права доступа только от одного родителя).

При организации связи через поле entityreference непосредственно дочерняя сущность ничего не знает о родительской, т.к. связь производится через поле родительской сущности.
Можно конечно извратиться и специальным запросом к БД вытаскивать из нее родительскую сущность для дочерней, но тут чревато граблями, как минимум надо будет еще контролировать, чтобы у дочерней сущности был только один родитель.

Значит надо сделать так, чтобы дочерняя сущность связывалась с родительской как-то более очевидно.

Самый простой способ, это чтобы не в родительской сущности было поле связи с дочерней, а наоборот:
чтобы в дочерней сущности было поле entityreference на сущность, от которой она будет наследовать права доступа (родительскую).

Способ сложнее, но универсальнее - реализовать связь родитель-ребенок1-реденок2-ребенок-N например по принципу "materialized path", примерно такой используется в "стандартном" модуле book.

Аватар пользователя vlucas vlucas 15 марта 2019 в 0:37

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

Аватар пользователя gun_dose gun_dose 14 марта 2019 в 22:50
1

https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21...

А родительскую сущность можно достать через
https://api.drupal.org/api/drupal/core%21lib%21Drupal%21Core%21Entity%21...

Дедовские и прадедовские можно доставать через многократный вызов loadByProperties. Там запросы простые и в рамках того количества запросов, что делает друпал эти плюс два-три запроса погоду не сделают.

Можно ещё извратиться и за один хитрый запрос с джойнами достать нужный айдишник.

Аватар пользователя vlucas vlucas 16 марта 2019 в 14:50

Спасибо, помогло!
Подскажи, есть ли другой способ определения дочерней сущности кроме EntityStorageBase::loadByProperties.
Может как-то можно определить контекст вызова?

Аватар пользователя gun_dose gun_dose 16 марта 2019 в 16:23

Дочерней или родительской? Что касается контекстов, мне как-то не довелось с ними толком поработать. Всё, что я знаю о контекстах - это то, что они есть)))