アクセス許可をデバッグするにはどうすればよいですか?


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

1つの方法は、カスタムモジュールを作成し、すべてのページ、すべてのノード、すべてのブロックにアクセス情報を印刷することです。

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 14年

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]);

これは実際にはかなり良いです。フィールド権限のデバッグはどうですか?
ミカルプルジビロビッチ14

値が一気に表示されますが、drushはユーザーが誰であるかを知りません。ただし、hook_menuで定義されたページには表示されません。なぜだかわからない。
sam452

error_log画面に出力しません。私のインストールでは、Apacheエラーログに書き込まれました。 php.net/manual/en/function.error-log.php
ライア

5

アクセス許可のトラブルシューティングを行うためのGUIベースのツールはすべて揃っているようです。私が過去に効果的に使用したもう1つの高度な(そしておそらくより難しい)トリックは次のとおりです。

  1. テストするフィールド、ロール、ノードタイプなどでビューを作成します。
  2. ビューの詳細オプションページで「クエリの表示」を有効にします。
  3. ビューを実行し、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.