web-dev-qa-db-ja.com

AJAXリクエストでの403エラー

モジュールに次のメニュー項目を定義しました。

_function visita_virtual_menu(){
$items = array();
$items['visita_virtual/marker_selected_handler'] = array(
        'title' => t('Marker Selected Handler'),
        'description' => t('Ajax handler for selected markers'),
        'type' => MENU_CALLBACK,
        'access arguments' => array('access panoramas'),
        'callback' => 'marker_selected_handler');
return $items;
_

}

そして、私のモジュールに特別な許可を作成しました:

_function visita_virtual_permission(){
return array('access panoramas' => array(
        'title' => t('Configurar Panoramas'),
        'description' => t('Configurar la visita virtual'),
        )
);
_

}

当然のことながら、アクセスパノラマの権限はDrupalの[People Permissions]設定タブに表示されました。匿名ユーザー、ログに記録されたユーザー、および管理者ユーザーに割り当てました(テスト目的のみ)。

今、私のJavaScript関数は次のことを行います:

_alert('Callback URL: '+url);

    $.ajax({
        type : "POST",
        url : url,
        data : {
          'marker_latitude' : location.lat,
          'marker_longitude' : location.lng,
        },
        success : function(data){
            alert('Entro a la funcion success');
        },
        error: function(xmlhttp) {
            alert('An error ocurred: '+xmlhttp.status);
        }
    });
_

alert('Callback URL: '+url);行には、次の情報が表示されます。

/ drupal/visita_virtual/marker_selected_handler

ただし、403アクセス禁止エラーが常に発生します。なぜ??私は何を間違っていますか???

私はサーバーのコードをデバッグしていますが、問題はmenu.incのこのコードにあるようです。

_function menu_execute_active_handler($path = NULL, $deliver = TRUE) {
// Check if site is offline.
$page_callback_result = _menu_site_is_offline() ? MENU_SITE_OFFLINE : MENU_SITE_ONLINE;

// Allow other modules to change the site status but not the path because that
// would not change the global variable. hook_url_inbound_alter() can be used
// to change the path. Code later will not use the $read_only_path variable.
$read_only_path = !empty($path) ? $path : $_GET['q'];
drupal_alter('menu_site_status', $page_callback_result, $read_only_path);

// Only continue if the site status is not set.
if ($page_callback_result == MENU_SITE_ONLINE) {
if ($router_item = menu_get_item($path)) {
  if ($router_item['access']) {
    if ($router_item['include_file']) {
      require_once DRUPAL_ROOT . '/' . $router_item['include_file'];
    }
    $page_callback_result = call_user_func_array($router_item['page_callback'],   $router_item['page_arguments']);
  }
  else {
    $page_callback_result = MENU_ACCESS_DENIED;
  }
_

_$path_パラメータがデフォルト値を取得しています。 NULL、次に_$read_only_path_がq _$_GET_値から取得されます。この場合、$ read_only_pathには値が設定されています:_visita_virtual/marker_selected_handler_いいですか? _/drupal/visita_virtual/marker_selected_handler_にすべきではありませんか?

この時点で$router_item = menu_get_item($path)は、「アクセス」値がfalseの$ router_itemを取得しています。それが403を受け取っている理由です。それでも失われましたが、メニューの何を間違って構成しているのかわかりません...

2
Pablo

Access deniedが表示されるのは、メニュー項目に_page callback_属性が指定されていないためです。 (代わりにcallbackを使用しています)。 hook_menu()here のドキュメントを確認できます。

同じページでは、メニュー項目の_page callback_属性が省略されている場合は、その親の_page callback_が使用されることがわかります。

ただし、問題のメニュー項目の親が存在しない場合は、_Access denied_を返します。これは、現在のユーザーによるメニュー項目へのアクセスが解決される前でも発生します。したがって、_access callback_は重要ではありません。 (それを変更しても改善されなかった理由を説明します)

1

Ajaxの経験はあまりありませんが、

$items['visita_virtual/marker_selected_handler'] = array(
  // ...
  'access callback' => TRUE,
)
0
Artur

追加する必要があります

'access callback' => 'user_access',

メニュー定義で(モジュールを無効/有効にします)

0
David Fells