Как ограничить доступ к узлам на основе значения поля?


Я создаю простую систему личных сообщений (нет необходимости в privatemsg), просто узел с заголовком, телом и полем ссылки на пользователя (entity_reference) для получателя (получателей). Как я могу ограничить доступ к узлу только для автора узла и пользователей, перечисленных в поле?

 2
Author: malcolm, 2012-07-06

2 answers

Я думаю, что модуль Ссылка пользователя на доступ к узлу будет делать именно то, что вы хотите. Это позволяет вам ограничить доступ к узлу на основе поля ссылки пользователя в этом узле. Он даже поставляется в вариантах Drupal 6 и 7.

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

 3
Author: Jimajamma, 2012-07-07 00:21:11

Однако, если вам это нужно для работы с 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.
}

И, вуаля, теперь у меня есть архитектура, которая предоставляет пользователям группы доступ к групповому "черновому" контенту на основе групповых ролей.

 1
Author: SomebodySysop, 2013-08-28 20:53:50