web-dev-qa-db-ja.com

アクセスを制御するためのhook_menu()およびhook_permission()の使用

「何が」ページにアクセスできるかをどのように制限しますか? hook_permission()を使用して、ロールに基づいてユーザー権限を設定し、hook_menu()アイテムへのアクセスを制御する方法を理解しています。ただし、システム自体でのみ使用されるhook_menu()アイテムがある場合はどうなりますか?たとえば、カスタムモジュールに登録ページがあるとします。_module/register_-誰でもそのページにアクセスできます。次に、ユーザーがページで何らかのアクションを実行したときに行われるajax呼び出しがあるとします。だから、私はhook_menu()に別の項目を登録し、それを_module/register/ajax_と呼びます-_module/register/ajax_を誰も閲覧できないようにしたいのですが、ajax呼び出しを行えるようにしたいですそのページへ。これを達成するための最良の方法は何ですか?

私はAJAXコールバックを使用しましたが、フォームが送信されている場合ではありません。これは、純粋なAJAXページの読み込み。

2
Brandon Bearden

速くて汚い、あなたはこのようなことをすることができます:

function YOURMODULE_menu() {

  $items=array();

  $items['YOURMODULE/register/ajax'] = array(
    'page callback' => 'YOURMODULE_register_ajax',
    'access callback' => 'YOURMODULE_access_ajax',
    'type' => MENU_CALLBACK,
  );

  // other $items here...

}

次に、このようにajaxの独自のアクセス関数を定義します。

function YOURMODULE_access_ajax() {

  if (user_is_logged_in() && $_SERVER['REQUEST_METHOD']=='POST') {
    return TRUE;
  } else {
    return FALSE;
  }

}

これは、ユーザーがログインしていて、POSTを使用してパスにアクセスしている場合にのみパスへのアクセスを許可します。ここでのキーは、サーフィンをするとき、GETを使用するときですが、AJAXを使用するときは、少なくともほとんどの場合、POSTを使用しています。ユーザーがログインしているだけでなく、もっと凝ったものにしたい場合は、user_access()を使用して、単純なuser_is_logged_in()

ただし、AJAXにGETを使用している場合は、ページコールバックでパラメーターを確認し、パラメーターが検証されない場合は、drupal_json()の代わりにreturn MENU_NOT_FOUND;またはreturn MENU_ACCESS_DENIED;を使用できます。

3
Jimajamma