Просмотры Поиск Без учета разрешений на доступ к пользовательскому узлу


У меня есть функция hook_node_access, которая запрещает пользователям просматривать доступ к узлу страницы, если у узла есть определенный тег, и они не являются аутентифицированным пользователем.

Это нормально работает для прямого просмотра страницы, но незарегистрированные пользователи все равно могут видеть узлы, в которых им следует отказать, на странице поиска с поддержкой представлений. Когда они переходят на страницу, им отказывают в доступе.

Я использовал модуль управления доступом к таксономии, чтобы сделать это раньше, и это скрывало результат поиска, мне пришлось отключить его из-за конфликта с другим модулем.

Есть ли что-нибудь дополнительное, что мне нужно сделать, чтобы представления распознавали эти разрешения?

Вот мой крючок и вспомогательная функция:

function mymod_page_perms_node_access($node, $op, $account){ 
  if ($op === 'view' && in_array($node->type, array('page','publication'))){
    $access_level = field_get_items('node', $node, 'field_access_level');
    if (count($access_level)){
      $access_level = $access_level[0]['tid'];

      $accessIDtoRoleID = array(
        '68' => '7',
        '69' => '2');
      if (isset($accessIDtoRoleID[$access_level])){

        global $user;
        $requiredRole = $accessIDtoRoleID[$access_level];
        if (mymod_page_perms_check_allowed_roles_array(array($requiredRole),$user->roles)){
          return NODE_ACCESS_ALLOW;
        } else {
          return NODE_ACCESS_DENY;
        }
      }
    }
  }

  return  NODE_ACCESS_IGNORE;
}

function mymod_page_perms_check_allowed_roles_array($allowedRolesIds,$roles){
  foreach ($roles as $rid => $role){
    if (in_array($rid, $allowedRolesIds)){
      return true;
    }
  }
  return false;
}

Спасибо

Author: PigChicken, 2012-12-10

1 answers

Похоже, что лучший способ контролировать доступ к узлу - это использовать hook_node_access_records и hook_node_grants, как описано здесь http://drupal.org/node/1260948 . Это правильно работает с представлениями.

Я написал этот простой модуль на основе инструкций по ссылке выше:

define('MYMOD_REALM', 'mymod');
define('MYMOD_GRANT_ID_PUBLIC', 0);
define('MYMOD_GRANT_ID_MEMBER', 1);
define('MYMOD_GRANT_ID_BOARD', 2);
define('MYMOD_BOARD_MEMBER_RID', 7);
define('MYMOD_MEMBER_TID', 69);
define('MYMOD_BOARD_MEMBER_TID', 68);

/**
  * Implementation of hook_node_grants().
  */
function mymod_node_grants($account, $op) {

  if ($op == 'view') {
    $grants[MYMOD_REALM] = array( MYMOD_GRANT_ID_PUBLIC );
    if (array_key_exists(DRUPAL_AUTHENTICATED_RID, $account->roles)) {
      $grants[MYMOD_REALM][] = array( MYMOD_GRANT_ID_MEMBER );
    } 
    if (array_key_exists(MYMOD_BOARD_MEMBER_RID, $account->roles)) {
      $grants[MYMOD_REALM][] = array( MYMOD_GRANT_ID_BOARD );
    } 
    return $grants;
  }
}

/**
 * Implementation of hook_node_access_records().
 */
function mymod_node_access_records($node) {

  $grant = array(
      'realm' => MYMOD_REALM,
      'gid' => MYMOD_GRANT_ID_PUBLIC,
      'grant_view' => 1,
      'grant_update' => 0,
      'grant_delete' => 0,
      'priority' => 0,
    );
  if (in_array($node->type, array('page','publication'))){
    $access_level = field_get_items('node', $node, 'field_access_level');
    if (count($access_level)){
      $access_level = (int)$access_level[0]['tid'];

      switch ($access_level) {
        case MYMOD_BOARD_MEMBER_TID:
          $grant['gid'] = MYMOD_GRANT_ID_BOARD;
          break;
        case MYMOD_MEMBER_TID:
          $grant['gid'] = MYMOD_GRANT_ID_MEMBER;
          break;
      }
    }
  }
  $grants[] = $grant;

  return $grants;
}
 5
Author: PigChicken, 2012-12-11 14:48:53