권한을 어떻게 디버깅합니까?


36

Drupal 7에서 권한을 어떻게 디버깅합니까?

핵심보고, 오류 로그, 개발 모듈 오류 로그, 역 추적 및 노드 액세스 권한 블록을 사용하지만 때로는 충분하지 않습니다. 특정 필드, 뷰 또는 블록이 사용자에게 표시되지 않는 이유를 알아 보려면 무엇을 확인해야합니까?

또한 호출 된 권한에 대한보고를 위한 Drupal 6모듈이 있지만 Drupal 7에서는 사용할 수 없습니다.

다양한 권한 관련 타사 모듈을 사용하고 있습니다.

 - devel node access 7.x-1.x-dev 
 - fast permissions administration 7.x-2.0
 - organic groups access control 7.x-1.x 
 - profile2 group access 7.x-1.x-dev 
 - ur-node access 7.x-1.x-dev

이것은 질문의 중요한 부분 일 수 있습니다 : node_access 와 같은 contrib 또는 사용자 정의 노드 액세스 모듈을 사용하고 있습니까 ?
아마추어 바리 스타

자체 참고 사항 : node_access는 D7에서 사용할 수 없으며 D6에서만 사용할 수 있습니다. 그러나 다른 권한 모듈이 관련 될 수 있습니다.
아마추어 바리 스타

@amateurbarista 예, PS2에서 언급 한 것처럼 권한 모듈을 사용하고 있습니다.
Refineo

filter_perms 모듈은 위에서 언급 한 permissions_report 모듈에 해당하는 Drupal-7입니다.
Druvision

답변:


21

당신이 할 수있는 한 가지 방법은 모든 페이지, 모든 노드, 모든 블록에서 사용자 정의 모듈, 인쇄 액세스 정보를 만드는 것입니다.

menu_get_item () 함수는 현재 페이지에 대한 access_arguments 속성이있는 라우터 항목을 반환합니다.

/**
 * Show access permission of current page.
 */
function yourmodule_get_page_access() {

  $router_item = menu_get_item();
  if ($router_item) {

    $access_arguments = unserialize($router_item['access_arguments']);

    $arguments = array();
    foreach ($access_arguments as $access_argument) {
      $arguments[] = $access_argument;
    }
    if ($arguments) {
      $output  = '<p>';
      $output .= t('This page needs user to have %p permission(s) to access', array(
        '%p' => implode(', ', $arguments),
      ));
      $output .= '</p>';
    }
    else {
      $output = '<p>' . t('This page needs no user permissions') . ' </p>';
    }
    return $output;
  }
}

그런 다음 hook_page_alter를 사용하여 모든 페이지 위에 액세스 정보를 표시 할 수 있습니다.

/**
 * Implements hook_page_alter().
 *
 * Display access information on top of every page.
 */
function yourmodule_page_alter(&$page) {

  // Make a new area on top of the page for displaying access information.
  $page['content']['theverytop']['#markup'] = yourmodule_get_page_access();
  $page['content']['theverytop']['#weight'] = -10;
  $page['content']['#sorted'] = FALSE;
}

다음으로 다음과 같이 블록 권한 정보를 표시 할 수 있습니다.

/**
 * Implement hook_block_alter
 *
 * To display block permission information to the block title.
 */

function yourmodule_block_view_alter(&$data, $block) {
  $delta = $block->delta;
  $output = '';

  $rid = db_query("SELECT rid FROM {block_role} WHERE delta = :delta", array(':delta' => $delta))->fetchCol();

  if (empty($rid)) {
      $output = ' This block does not have any role permission restriction.';
  } else {
      $output = ' This block is viewable for users have role(s): ';
      foreach ($rid as $role_id) {
          $rolename = db_query("SELECT name from {role} where rid = :rid", array(':rid' => $role_id))->fetchField();
          $output .= $rolename . ' ';
      }
  }

  // append the permission info to block title for every block
  $block->title .= $output;
}

그리고 기본적으로 동일한 개념으로 노드, 형태, 뷰에 대해 동일한 작업을 수행 할 수 있습니다. 이것이 도움이되기를 바랍니다.


액세스 인수가 yourmodule_get_page_access()의미가 없으면 $router_item['access_callback']관련 모듈에서 해당 이름의 함수를 살펴보고 검색하여 거기에서 무슨 일이 일어나고 있는지 확인할 수 있습니다. 좋은 대답입니다.
Wtower

7

사용자 모듈 기본 파일을 편집하십시오. user_access()함수를 찾고 return명령문 앞에 2 행을 추가 하고 PHP 오류 로그를 모니터하십시오.

$granted = isset($perm[$account->uid][$string]);
error_log(sprintf('--- user_access: %s "%s" = %s', $account->name, $string, $granted ? 'yes' : 'no'));
return isset($perm[$account->uid][$string]);

이것은 실제로 꽤 좋습니다. 디버그 필드 권한은 어떻습니까?
Michal Przybylowicz

drush에서 값을 볼 수 있지만 drush는 사용자가 누군지 알 수 없습니다. 그러나 hook_menu에 정의 된 페이지에는 나타나지 않습니다. 왜 그런지 잘 모르겠습니다.
sam452

error_log화면에 출력되지 않습니다. 설치를 위해 아파치 오류 로그에 썼습니다. php.net/manual/en/function.error-log.php
Ryre

5

권한 문제를 해결하기위한 모든 GUI 기반 도구가 이미있는 것 같습니다. 과거에 내가 효과적으로 사용했던 한 가지 고급 (아마도 더 어려운) 트릭은 다음과 같습니다.

  1. 테스트하려는 필드, 역할, 노드 유형 등을 사용하여보기를 구성하십시오.
  2. 보기 고급 옵션 페이지에서 "조회 표시"를 사용하십시오.
  3. View를 실행하고 SQL 쿼리를 Navicat (상업용) 또는 MySQL Workbench (무료)와 같은 GUI 기반 SQL 편집기에 붙여 넣습니다.
  4. 어떤 노드가 표시되지 않는지 확인하십시오.
  5. 필요에 따라 쿼리를 조정하십시오.

많은 경우에 뷰가 뱉어내는 쿼리는 다소 복잡하고 (조인으로 가득한 충격) 수동으로 구성하는 데 시간이 조금 더 걸립니다 (그리고 오류가 발생하기 쉽습니다). 또한이 접근 방식은 사용자가보고있는 것에 대해 테스트하고 있는지 확인합니다. Drupal 코어 권한을 사용하는 권한 모듈을 활성화 한 경우 해당 테이블 조인이 뷰에서 사용하는 쿼리에 표시됩니다. 이 쿼리를 얻은 후에는 예를 들어 역할 x에 허용되는 콘텐츠 유형 x의 노드 수를 표시하도록 조정했습니다. 보고가 얻을 수있는만큼 정확하고 세밀합니다. 그리고 그것들은 나의 "고급"보고서입니다.


2

Drupal에서는 디버거를 몇 번 사용해야합니다 (netbeans가있는 xdebug). 많은 함수를 간접적으로 호출하여 코드를 읽거나, 역 추적을 인쇄하거나, 최종 출력을 확인하여 실제로 전체적으로 추가되는 것을 거의 수행 할 수 없습니다.

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