Вы не должны создавать перенаправления, когда доступ запрещен.Это логическая ошибка в любом веб-фреймворке.Вы должны выдать «Отказано в доступе», если вы хотите отказать в доступе.Точно так же, как вы выдаете «контент перемещен туда, пожалуйста, перейдите туда», когда ваш контент перемещается
Вместо drupal_goto()
используйте drupal_access_denied()
.Если вы действительно хотите, чтобы люди перенаправлялись на другой URL-адрес, место для этого будет на странице, на которой показан отказ в доступе .
При этом выдается drupal_access_denied()
,или, на самом деле, отправка любого заголовка в hook_init()
совершенно неверна.Из документации : «Выполнение задач настройки». Отправка заголовков не задача установки.Более того, та же самая документация предупреждает о другой потенциальной проблеме с вашим подходом: «Этот хук не запускается на кэшированных страницах», другими словами, когда взрослый посещает страницу, и она кэшируется, несовершеннолетние посетители не будут перенаправлены или лишены доступаони получат кешированную страницу.
Теперь о том, что вы должны сделать: модуль типа Taxonomy Access (Lite) или более подходящий Node Privacy By Role может использоваться для предоставления доступа к вашему контенту.Обратите внимание, что по умолчанию представления не будут использовать эти права доступа: они будут отображать списки содержимого независимо от доступа пользователя: вам придется перенастроить все ваши представления, чтобы либо соблюдать правила доступа, либо быть полностью недоступными, чтобыопределенные роли.Кроме того, вам нужно дать «несовершеннолетним» отдельную роль: таким образом вы можете предоставить им другой доступ, нежели люди в роли «аутентифицированный пользователь» или даже «взрослый».Вам понадобится какой-то механизм, чтобы автоматически назначать роли .