hook_menu_alter() противоречивый ответ

Нужна помощь с этим фрагментом кода, который отвечает для пользователя #1, но не для других вошедших в систему или анонимных пользователей

function module_menu_alter(&$items) {
  $items["node/add/page"]['access callback'] = 'module_access_callback';
}

function module_access_callback(){    
  die('responding here - test');
}

Может кто-нибудь сказать мне, что я делаю не так, пожалуйста?

2 ответа

ОК Оказывается, ответ на самом деле очень прост...

Ты звонишь menu_get_object() получить узел, но на нем нет узла node/add/page, На самом деле совсем наоборот; не имеет смысла иметь доступный узел на странице для добавления узла, так как он еще не был создан! 403 является побочным эффектом этого.

Вам нужно будет принять решение о доступе, основываясь на каком-то другом значении (обычно зарегистрированный пользователь вместе с разрешением, так как @kiamlaluno очень хорошо объяснил в своем ответе).

Также убедитесь, что вы вернетесь TRUE или же FALSE от вашего доступа обратного вызова, как @kiamlaluno также заявил:)

РЕДАКТИРОВАТЬ

Просто сказать, что это частично ответ на https://stackru.com/questions/8342169/drupal-hook-menu-alter-menu-get-object-error, который объясняет, почему в этом ответе упоминаются функции, которые не не упоминается в вопросе.

Если это код, который вы действительно используете, то функция обратного вызова доступа неверна, так как должна возвращать TRUE когда пользователь, вошедший в систему, имеет доступ к меню, и FALSE когда пользователь не имеет доступа к меню. Не использует die(),

Вот что сообщается в документации для hook_menu ():

"обратный вызов доступа": функция, возвращающая TRUE если пользователь имеет права доступа к этому пункту меню, и FALSE если не. Это также может быть логическая константа вместо функции, и вы также можете использовать числовые значения (будет приведено к логическому значению). По умолчанию используется user_access(), если значение не наследуется от родительского пункта меню; только элементы MENU_DEFAULT_LOCAL_TASK могут наследовать обратные вызовы доступа. Чтобы использовать user_access() обратный вызов по умолчанию, вы должны указать разрешение для проверки в качестве "аргументов доступа".

Если вы не показываете код, который используете, то последующее может объяснить поведение, которое вы видите.
Первый пользователь, или пользователь № 1, является конкретным пользователем, потому что user_access() всегда возвращает TRUE для этого пользователя. Это очевидно в коде этой функции, которая явно проверяет, что идентификатор пользователя равен 1.

// User #1 has all privileges:
if ($account->uid == 1) {
  return TRUE;
}

Если обратный вызов доступа возвращается FALSE для аутентифицированных пользователей, и он использует user_access()это потому, что прошедшие проверку пользователи не имеют разрешения, переданного функции.

Также может быть, вы проверяете более одного разрешения, и вы используете user_access('first permission') && user_access('second permission'), вместо user_access('first permission') || user_access('second permission') (или наоборот). Для пользователя #1, который не имеет никакого значения, в результате user_access('first permission') && user_access('second permission') а также user_access('first permission') || user_access('second permission') всегда TRUE, даже если вы передаете в функцию строку для разрешения, которое не определено ни в одном модуле.

Другие вопросы по тегам