如何使用hook_menu_alter()在Drupal 6中定位特定的内容类型

时间:2012-06-29 19:38:15

标签: php security drupal drupal-6

我正在尝试定位特定的内容类型,以便匿名用户尝试访问内容类型的页面时,它将为他们提供未经授权的消息。为此,我认为我需要使用hook_menu_alter()并向其添加访问回调。 (这是Drupal 6网站)。

我遇到的问题是我真的不知道如何向菜单系统识别该内容类型的节点。我知道生成的URL看起来像“name-and-biology / name-and-tradition-%username”。所以我尝试了一些其他的组合,似乎无法让它发挥作用。

我基本上尝试了这个:

function mysite_profile_menu_alter(&$items) {
  //Restrict access to profile pages
  $items['name-and-biography/%title']['access callback'] = 'mysite_profile_content_access';
}


function mysite_profile_content_access() {
  //Check to make sure they are an authenticated user
  GLOBAL $user;

  foreach ($user->roles as $role) {
    if ($role == 'authenticated user') {
      return TRUE;
    }
  }

  return FALSE;
}

我也尝试过像“name-and-biology /%”和“name-and-biology / *”这样的项目路径。它似乎没有工作。默认的URL别名设置为“[type-name] / [title-raw]”。标题生成设置为“[type-name] - ([author-name])”。

我也尝试过使用hook_access(),但似乎没有运行。甚至在多次刷新所有缓存之后。似乎都不是。

有没有人对我在hook_menu_alter()中如何定位这个有任何想法?或者让hook_access()工作?还是其他任何想法?我确实尝试过内容访问模块,但它在我们的网站上产生了问题。因此,首选另一种选择。

谢谢!

2 个答案:

答案 0 :(得分:1)

实施hook_nodeapi()以检查view上的访问权限:

/**
 * Implementation of hook_nodeapi().
 */
function MODULE_nodeapi(&$node, $op, $a3 = NULL, $a4 = NULL) {
  global $user;

  switch ($op) {
    case 'view':
      if ($node->type == 'CONTENT_TYPE' && $user->uid < 1) {
        drupal_access_denied();
        exit;
      }
      break;
  }
}

答案 1 :(得分:0)

hook_menu_alter是关于改变现有项目(路径,如/ admin,/ node /%,admin / reports / status等)。如果要添加新菜单项,请改用hook_menu()。 此外,您没有定义页面回调,因此这也不是有效的hook_menu()。

通常为了引入新的权限级别,我们使用hook_perm()来添加新的权限项。因此,您无需硬编码允许哪些角色访问内容。您也可以尝试Content Access模块。

请参阅http://drupalcode.org/project/examples.git/blob/refs/heads/6.x-1.x:/node_access_example/node_access_example.module,这是节点访问的一个很好的示例。