메뉴 링크를 숨기는 컨텐츠 액세스 모듈


10

Drupal 7과 함께 컨텐츠 액세스 모듈을 사용 하고 있습니다. 특정 역할에서 노드 액세스를 제한하면 메뉴의 링크도 숨겨집니다.

주 메뉴에 제한된 링크를 표시하는 방법이 있습니까?


메뉴는 어떻게 만드나요? 프로그래밍 방식으로? 또는에서 관리자 UI를 사용하여 admin/structure/menu/manage/main-menu/add?
AjitS

내용을 만들 때 메뉴를 추가하고 있습니다. 하단의 '메뉴 링크 제공'옵션.
monymirza

답변:


1

액세스 컨텐츠 시스템의 주요 목적은 모든 사용자가 가능한 모든 보안 문제를보고 피할 수있는 것을 제어하는 ​​것입니다. 이것은 원하는 동작이며 거의 모든 모듈 또는 일반 ApI에서 사용하므로 기본 솔루션을 찾을 수 없습니다.

나는 같은 상황에 있었고 내가 찾은 유일한 해결책은 사용자 정의 모듈을 만들고 내 경우에는 원하는 모든 요소를 ​​얻기 위해 메뉴 테이블에 직접 쿼리하고 링크를 표시 할 수있는 권한을 직접 확인하는 것입니다. 사용자에게 콘텐츠를 볼 권한이없는 경우 콘텐츠 제목


컨텐츠 액세스 모듈을 사용해야합니까?
monymirza

메뉴 자체에는 차단 된 노드가 표시되지 않습니다. 메뉴의 노드를 가져 오는 모듈을 만들었습니다. 그런 다음 모든 노드에 대한 링크를 표시하거나 (사용자에게 액세스 권한이없는 경우 403 페이지가 표시됨) 각 노드에 대한 컨텐츠 액세스 모듈 권한을 확인하고 사용자가 표시하지 않으면 링크를 표시하지 않도록 선택할 수 있습니다 액세스 할 수 없습니다.
david ruiz

1

나는 커스텀 모듈을 통해 이것을했다 :

function mymodule_form_menu_edit_item_alter(&$form, &$form_state, $form_id) {
     if ($form_state['build_info']['args'][0] == 'edit') {
       $item = $form_state['build_info']['args'][1];

       $form['ignore_access_roles'] = array(
         '#type' => 'checkboxes',
         '#multiple' => TRUE,
         '#title' => t("Ignore access"),
         '#options' => user_roles(),
         '#description' => t("If a user with one of the selected roles has no access to the menu item's path, the menu item is <strong>not</strong> hidden."),
         '#default_value' => empty($item['options']['ignore_access_roles']) ? array() : $item['options']['ignore_access_roles'],
       );

       $form['#validate'][] = 'mymodule_form_menu_edit_item_validate';
     }
   }

   function mymodule_form_menu_edit_item_validate(&$form, &$form_state) {
     if (isset($form_state['values']['ignore_access_roles'])) {
       $form_state['values']['options']['ignore_access_roles'] = $form_state['values']['ignore_access_roles'];


       $form_state['values']['options']['alter'] = TRUE;
     }
   }


   function mymodule_translated_menu_link_alter(&$link, $map) {
     if (!empty($link['options']['ignore_access_roles']) && empty($link['access'])) {

       global $user;

       // Get role ids for which the ignore access option applies.
       $rids = array_values($link['options']['ignore_access_roles']);

       $matching_rids = array_intersect(array_keys($user->roles), $rids);

       if (!empty($matching_rids)) {
         // User has one of the specified roles: override menu link access.
         $link['access'] = TRUE;

         // Localize. This must be done because it is only done for links with
         // access TRUE in _menu_link_translate.
         _menu_item_localize($link, $map, TRUE);
       }
     }
   }

0

나는 이것을 처리하기 위해 사용자 정의 모듈을 작성해야한다고 확신합니다. 내 생각은 : 콘텐츠 액세스 제한을 완화하십시오. 즉, 사용자가 귀하의 콘텐츠를 볼 수있게하십시오. 그런 다음 사용자 정의 모듈은 hook_node_load ()를 구현하고 사용자가 볼 수없는 노드를로드 할 때 403 HTTP 응답을 출력해야합니다. 또한 hook_permission ()도 구현해야하므로 권한 페이지에서 쉽게 액세스를 구성 할 수 있습니다.

다음은 전체 노드를 숨기고 컨텐츠 유형 및 권한으로 필터링하는 간단한 예입니다.

function mymodule_permission() {
  return array('access reserved content');
}

function mymodule_node_load($nodes, $types) {
  if (in_array('my_reserved_content_type', $types)) {
    if (!user_access('access reserved content')) {
      drupal_access_denied();
    }
  }
}

또는 403을 반환하는 대신 일부 노드 필드를 숨길 수 있습니다. 그러나 hook_node_load ()에 대한 API 설명서에 따라 권장하지 않습니다.


내용을 만들 때 메뉴를 추가하고 있습니다. 하단의 '메뉴 링크 제공'옵션.
monymirza

컨텐츠 액세스 모듈을 사용해야합니까?
monymirza

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.