Drupal 7 - как разрешить приложению доступ к определенному URL-адресу drupal (из хука меню), либо с супер-основной аутентификацией на основе URL-адреса, либо анонимно

Я новичок в drupal, так что потерпите меня, если я использую неправильные термины. Я пытаюсь дать глупому базовому приложению доступ к URL-адресу drupal - это приложение не может выполнять сложную аутентификацию.

В противном случае этой системе drupal требуется аутентификация, а все остальные хуки меню используют 'access arguments' => array('access content')

Еще до того, как искать решение для простого метода аутентификации с помощью drupal, такого как http://user:[email protected]/awesome/member/12345, я попытался просто предоставить анонимный доступ с помощью следующего блока кода в файле .module drupal.

function awesome_module_menu() {
  $items['awesome/member/%'] = array(
    'title' => 'Awesome member',
    'type' => MENU_NORMAL_ITEM,
    'page callback' => 'aw_memberdata_fetch',
    'delivery callback' => 'aw_memberdata_deliver',
    'access arguments' => TRUE // this supposedly should allow anonymous access - from the web
  );
  return $items;
}

У меня есть две функции: одна для получения данных, другая для их отображения:

function aw_memberdata_fetch(memberId)
{
    //fetch array of objects from DB
    ...
    return $items;
}
function aw_memberdata_deliver($items)
{
    switch(arg(3)) //format, comes after items
    {
      case 'json':
        drupal_json_output($items);
      break;
      default: 
        $output = makeHtml($items); //makes HTML
        drupal_deliver_html_page($output);
    }
}

С аутентифицированным браузером это работает так, как задумано. Из браузера без файла cookie авторизации мне разрешено видеть HTML, но результатов там нет, как будто функция page callback не работает для анонимных пользователей, а delivery callback работает.

Как заставить это работать для анонимных пользователей?


person Madd0g    schedule 09.11.2013    source источник
comment
В hook_menu я бы добавил: 'аргументы страницы' => массив (2),   -  person donutdan4114    schedule 10.11.2013


Ответы (1)


Вы используете access arguments с функцией user_access по умолчанию для проверки разрешений. Это в основном вызовет user_access(true), который вернет

  • true для аутентифицированного пользователя (вероятно, вы тестируете с учетной записью администратора (uid = 1)), что позволяет обойти проверку проверки. Администратор имеет полные права.
  • false для анонимных пользователей, поскольку строковое значение первого аргумента, переданного в user_access true, не существует в качестве параметра разрешения.

Вы должны использовать либо использование

  • пользовательский хук YOURMODULE_access, который выполняет проверку разрешений
  • объявить пользовательские разрешения для вашего модуля (крючок YOURMODULE_permission)
  • не используйте проверку разрешений с помощью 'access callback' => true, который дает доступ анонимным и аутентифицированным пользователям
function awesome_module_menu() {
    $items['awesome/member/%'] = array(
        'title' => 'Awesome member',
        'type' => MENU_NORMAL_ITEM,
        'page callback' => 'aw_memberdata_fetch',
        'delivery callback' => 'aw_memberdata_deliver',
        'access callback' => true,
    );

    return $items;
}
person Mike Vranckx    schedule 10.11.2013