Как ограничить доступ к узлам на основе значения поля?
Я создаю простую систему личных сообщений (нет необходимости в privatemsg), просто узел с заголовком, телом и полем ссылки на пользователя (entity_reference) для получателя (получателей). Как я могу ограничить доступ к узлу только для автора узла и пользователей, перечисленных в поле?
2 answers
Я думаю, что модуль Ссылка пользователя на доступ к узлу будет делать именно то, что вы хотите. Это позволяет вам ограничить доступ к узлу на основе поля ссылки пользователя в этом узле. Он даже поставляется в вариантах Drupal 6 и 7.
Из того, что я могу сказать, вы хотите убедиться, что используете только один модуль доступа к узлу для своей системы, поэтому вы можете посмотреть обзор модуля доступа к узлу , чтобы убедиться, что это лучший выбор.
Однако, если вам это нужно для работы с OG, у вас могут возникнуть некоторые проблемы. Я хотел сделать то же самое, и, следуя этому руководству, http://www.phase2technology.com/blog/drupal-7-node-access-grants-locks-and-keys /, решил использовать hook_node_access_records() и hook_node_grants().
У меня есть поле field_draft, которое является логическим. Если он включен, то доступ ограничен только для пользователей группы, у которых в группе есть роль "просмотр черновика содержимого". Кроме того, они может видеть узел с этим полем только в том случае, если он находится в группе, в которой у них есть разрешение.
Во-первых, поскольку я хочу использовать разрешения на уровне группы, я использую hook_og_permissions для дублирования моих разрешений на уровне всего сайта в OG:
/**
* Implements hook_og_permission().
*/
function example_og_permission() {
$permissions = array();
foreach (example_permission() as $name => $details) {
$permissions[$name] = array(
'title' => $details['title'],
'description' => isset($details['description']) ? $details['description'] : '',
'default role' => array(OG_ADMINISTRATOR_ROLE),
);
}
return $permissions;
}
Затем я использую og_user_access(), чтобы назначить разрешение пользователям, у которых есть разрешение на доступ к черновому контенту в их группах:
function example_node_grants($account, $op) {
// Check OG
// We check permissions to access the node, for all the groups the user is a
// member.
foreach (og_get_entity_groups() as $group_type => $gids) {
foreach ($gids as $gid) {
if ($op == 'view' && og_user_access($group_type, $gid, 'access draft content', $account)) {
$grants['example_draft_view_'.$gid] = array(EXAMPLE_GRANT_ALL);
}
}
}
return $grants;
}
Наконец, я создаю записи о грантах. Обратите внимание, что, поскольку поле field_draft является настраиваемым полем, мне нужно чтобы убедиться, что он существует в узле, ПРЕЖДЕ чем я проверю, включен он или выключен.
function example_node_access_records($node) {
// We only care about the node if it's been marked draft. If not, it is
// treated just like any other node and we completely ignore it.
if (array_key_exists('field_draft', $node)) { // check to see if field_draft exists in this node
if (array_key_exists('und', $node->field_draft)) { // I guess needed to do this for those nodes with empty values
if ($node->field_draft['und'][0]['value'] == 1) {
// Create grants for OG
foreach (og_get_entity_groups() as $group_type => $gids) {
foreach ($gids as $gid) {
$grants[] = array(
'realm' => 'example_draft_view_'.$gid,
'gid' => EXAMPLE_GRANT_ALL,
'grant_view' => 1,
'grant_update' => 0,
'grant_delete' => 0,
'priority' => 0,
);
}
}
}
}
return $grants;
}
// Return nothing if the node has not been marked draft.
}
И, вуаля, теперь у меня есть архитектура, которая предоставляет пользователям группы доступ к групповому "черновому" контенту на основе групповых ролей.