컨텐츠 유형을 기준으로 노드를 볼 수있는 역할 제한


18

Drupal 7을 사용하고 있으며 "eBook"이라는 새로운 콘텐츠 유형을 만들고 "MonthlySubscriber"라는 새로운 역할을 만들었습니다. 내 의도는 "MonthlySubscriber"를 가진 사용자 만 "eBook"노드를 볼 수 있도록하는 것입니다. 역할의 권한 설정을 살펴보면 해당 콘텐츠 유형의 노드를 생성, 편집 및 삭제할 수있는 확인란이 표시되었지만 노드를 볼 수있는 확인란은 없습니다.

"eBook"노드를 볼 수있는 사용자를 "MonthlySubscriber"역할을 가진 사용자로 제한하려면 어떻게해야합니까?

답변:


13

이 액세스 제어를 추가 하려면 컨텐츠 액세스 모듈 을 설치해야합니다 .

이 모듈을 사용하면 역할 및 작성자별로 컨텐츠 유형에 대한 권한을 관리 할 수 ​​있습니다. 각 컨텐츠 유형에 대한 사용자 정의보기, 편집 및 삭제 권한을 지정할 수 있습니다.


5

drupal 7의 경우 hook_node_access () 사용하십시오 .

/**
 * Implements hook_node_access().
 */
function YOURMODULE_node_access($node, $op, $account) {
  if (
    $node->type == 'ebook' &&
    $op == 'view' &&
    !in_array('MonthlySubscriber', $account->roles)
  ) { return NODE_ACCESS_DENY; }
  return NODE_ACCESS_IGNORE;
}

1
코드 전용 답변을 피하십시오. 그들은 학습 목적을 제공하지 않습니다. 적어도이 특정 코드가 정확히 어떻게 대답하는지 세 문장으로 설명하십시오. 어떻게 작동합니까? 왜 작동합니까? 다른 사람들이 비슷한 상황에서 비슷한 코드를 반복해서 묻지 않고 작성하는 데 도움이되는 설명입니다.
Mołot

이것이 정답이어야합니다.
GrafiCode

5

다음은 권한이없는 사용자로부터 노드 페이지 (노드 / NID)를 보호하는 간단한 방법입니다.

/**
 * Implements hook_menu_alter().
 */
function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_check_node_access';
}

/**
 * Determines whether the current user may perform the operation on the node.
 */
function mymodule_check_node_access($op, $node) {
  if ($node->type == 'protected_type' && !user_access('administer site configuration')) {
    return FALSE;
  }
  return node_access($op, $node);
}

2
hook_node_access보기와 같이 노드를 "목록"하는 항목에는 사용할 수 없습니다. 에서에서보기 액세스를 제한 할 수 hook_node_access있지만보기 또는 사용자 정의 노드 쿼리는 해당 노드를 사용자에게 계속 표시 할 수 있습니다. hook_node_access작성 / 업데이트 / 삭제 작업을 제어하는 ​​편집 제어에 더 유용합니다
Brian

귀하의 코드는 저에게 효과적이지 않지만 올바른 방향으로 나를 가리 켰습니다. hook_node_access 문서 api.drupal.org/api/drupal/modules%21node%21node.api.php/…
Camilo

Drupal이 hook_node_access 후크를 제공하는 동안 mymodule_node_access를 사용자 정의 함수로 사용하기 때문에 이는 나쁜 예입니다. 혼란 스러울 수 있습니다.
batigolix 2016 년

@ batigolix는 대답에 명시된 것처럼 노드가 아닌 노드 페이지를 보호하는 방법입니다.
ya.teck


1

drupal 7의 경우 다음을 시도하십시오. 용어 별 액세스

D7에 매우 유연한 계층 적 노드 액세스 제어 (콘텐츠 액세스 제어)를 제공합니다.


0

ya.teck이 게시 한 hook_menu_alter 솔루션은 작동하지만 기능 이름의 표준 hook_node_access와 충돌합니다. 이 경우 hook_menu_alter가 필요하지 않으므로 Denis가 게시 한 답변이 더 정확하고 올바른 방법이라고 생각합니다. 완료된대로 menu_item을 변경하는 것은 파이프의 다른 모듈에 의해 참조 될 수있는 첫 번째 참조 예입니다.


0

hook_node_access hook 에 대한 D7 api 문서에서 찾은 코드 스 니펫을 사용했습니다 .

이 코드는 "전자 책보기"권한이있는 사용자에게 "전자 책"컨텐츠를 볼 수있는 액세스 권한을 부여합니다.

hook_permission ()을 구현하여 액세스를 제어 할 수있는 새로운 권한이 필요합니다.

/**
 * Implements hook_permission().
 */
function mymodule_permission() {
  return array(
    'view ebook' => array(
      'title' => t('View Ebook'),
      'description' => t('View Ebook nodes.'),
    ),
  );
}

hook_node_access ()를 구현함으로써 Drupal은 노드에 대한 액세스 권한을 부여하거나 거부 할 수 있습니다.

/**
 * Implements hook_node_access().
 */
function mymodule_node_access($node, $op, $account) {

  // Checks for an ebook node in view mode.
  if (is_object($node) && $node->type === 'ebook' && $op === 'view') {

    // Grants permission to view the node if the current user has an role
    // with the permission 'view ebook'.
    if (user_access('view ebook')) {
      return NODE_ACCESS_ALLOW;
    }

    // Otherwise disallows access to view the node.
    return NODE_ACCESS_DENY;
  }
  // For all other nodes and other view modes, don't affect the access.
  return NODE_ACCESS_IGNORE;
}

다른 권한 (편집, 삭제 등)은 일반적인 Drupal 권한을 통해 처리 할 수 ​​있습니다.

선택적으로 hook_query_TAG_NAME_alter를 구현하여 관리자 개요에서 컨텐츠를 제거 할 수 있습니다.

/**
 * Implements hook_query_TAG_NAME_alter().
 */
function mymodule_query_node_admin_filter_alter(QueryAlterableInterface $query) {
  if (!user_access('view ebook')) {
  $query->condition('n.type', 'ebook', '!=');
  }
}

0

Node View Permissions 모듈을 사용하는 것이 좋습니다. 콘텐츠 액세스 모듈보다 간단합니다.

D6에서와 같이 "모든 컨텐츠보기"및 "자신의 컨텐츠보기"권한을 선택한 모든 컨텐츠 유형에 추가합니다.

여기에 이미지 설명을 입력하십시오

따라야 할 단계 :

  1. 설치 및 활성화 한 후 /admin/config/content/node-view-permissions액세스를 제한 할 컨텐츠 유형으로 이동하여 선택하십시오.
  2. 그런 다음 /admin/people/permissions#module-node_view_permissions 컨텐츠를 보려는 역할 로 이동하여 선택하십시오. 권한을 저장하십시오.

    끝난!


드루팔 8 "노드보기 권한"을 위해 작동하지 않습니다
Karthikeyan Manivasagam

@KarthikeyanManivasagam 어떻게 그렇게?
Chris Happy

우리는이 모듈을 프로젝트 중 하나에서 역할과 컨텐츠 유형에 따라 컨텐츠보기 액세스를 제공해야하지만 전혀 작동하지 않는 프로젝트에서 사용했습니다. 이 모듈을 사용하지 않고 동일하게 동작합니다.
Karthikeyan Manivasagam
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.