drupal - 为某些节点发出 403

标签 drupal drupal-6

您如何为某些节点发出 403?我尝试使用 drupal_access_denied。当我收到拒绝访问消息时,看门狗充满了:

无法修改 header 信息 - header 已发送

这正常吗?我没有使用 drupal_access_denied 吗?

最佳答案

使用建议的 hook_nodeapi() 仍然为时已晚。

如果您使用 $op = load ,你可能会耗尽你的内存,因为 Drupal 已经提交了它在加载节点时所做的所有正常事情(包括多次加载它)。

如果您使用 $op = view ,如果您执行以下操作,您可以“伪造”它:

function mymodule_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  switch ($op) {
    case 'view':
      drupal_access_denied();
      exit();
      break;
  }
}

但这不是真正的 403:除了在 Watchdog 中,它不会被报告,并且所有正常的东西仍然会加载和渲染,就好像节点在那里一样。

对于简单的 hack,您可以使用 hook_init() :
function mymodule_init() {
  $nodes_403 = array(42, 69, 187);
  if (arg(0) == 'node' && in_array(arg(1), $nodes_403))
    drupal_access_denied();
    exit();
  }
}

但这不必要地绕过了 Drupal 的内置权限系统。相反,您想利用 Drupal 的 node access rights系统拒绝访问该节点。

如果您在模块中定义了自己的内容类型,则可以使用 hook_access() :
function mymodule_access($op, $node, $account) {
  $nodes_403 = array(42, 69, 187);

  if (in_array($node->nid, $nodes_403)) {
    return FALSE;
  }
}

但是,如果您不定义自己的自定义内容类型,hook_access()永远不会被调用。因此,您需要覆盖节点路径的 access callback用你自己的:
function mymodule_menu_alter(&$items) {
  $items['node/%node']['access callback'] = 'mymodule_access';
}

function mymodule_access($op, $node, $account = NULL) {
  $nodes_403 = array(42, 69, 187);

  if ($op == 'view' && in_array($node->nid, $nodes_403)) {
    return FALSE;
  }

  return node_access($op, $node, $account);
}

因为 hook_menu_alter() 实现,请确保在实现上述操作后重建您的菜单系统。

关于drupal - 为某些节点发出 403,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3730199/

相关文章:

drupal - 开发模块查询日志未出现在自定义主题中

css - 使用 css 注入(inject)器的 drupal home 的大图像

drupal-6 - 如何在 Drupal 中显示日历?

Drupal, View : trimming text doesn't work because tags are not closed properly

drupal - Drupal 中没有标题节点

drupal - 如何创建包含全尺寸和缩略图图像的 View

java - 在 Java/Groovy 中使用 Rest 服务进行身份验证

drupal - 非基于主题的 Drupal 开发?

drupal - 在 Drupal 6 中以管理员权限运行 hook_cron

php - 如何将 mysql 表导出到 csv 文件并下载