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
あなたができる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;
}
など、基本的には同じ概念ですが、ノード、フォーム、ビューに対しても同じことができます。お役に立てれば。
Userモジュールのメインファイルを編集します。 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]);
権限のトラブルシューティングを行うためのGUIベースのツールがすべて揃っているようです。私が過去に効果的に使用したもう1つの高度な(そしておそらくもっと難しい)トリックは次のとおりです。
多くの場合、ビューが吐き出すクエリはかなり複雑で(ジョインでいっぱいのショック)、それらを手動で作成するには少し時間がかかります(さらに、エラーが発生しやすくなります)。また、このアプローチは、ユーザーが目にしているものに対してテストしていることを保証します。 (Drupalコア権限を使用する)権限モジュールを有効にしている場合、それらのテーブル結合は、ビューで使用されるクエリに表示されます。このクエリを取得したら、微調整して方法を示しますたとえば、コンテンツタイプxの多くのノードがロールxに許可されています。これは、レポートが取得できるのと同じくらい正確で細かいものです。これらは私の「高度な」レポートです。
Drupalでデバッガを使用する必要があります(netbeansではxdebug)。多くの関数が間接的に呼び出されるため、コードを読んだり、バックトレースを印刷したりするだけで、実際にグローバルに追加するものを追跡することはほとんど不可能です。最終出力を確認します。