【问题标题】:hook_menu_alter() inconsistent responsehook_menu_alter() 响应不一致
【发布时间】:2011-11-30 14:32:20
【问题描述】:

这段代码的 sn-p 响应用户#1,但不响应其他登录或匿名用户:

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

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

我做错了什么?

【问题讨论】:

  • 双重检查登录用户和匿名用户的权限可能他们没有访问“节点/添加/页面”的权限
  • 我为匿名用户和经过身份验证的用户设置了“访问内容”权限。我无法想象还有什么需要设置的。 ???
  • @sisko:我只是想亲自尝试一下你的代码,因为我怀疑它会起作用,而且还有其他因素(即某种节点访问模块)导致了这里的问题。

标签: drupal drupal-6 drupal-hooks


【解决方案1】:

如果那是你真正使用的代码,那么访问回调函数是错误的,因为它应该在当前登录的用户访问菜单时返回TRUE,当用户没有访问时返回FALSE无法访问菜单。它不使用die()

这是hook_menu() 文档中报告的内容:

“访问回调”:如果用户有权访问此菜单项,则返回TRUE 的函数,否则返回FALSE。它也可以是布尔常量而不是函数,您还可以使用数值(将被强制转换为布尔值)。默认为user_access(),除非值是从父菜单项继承的;只有MENU_DEFAULT_LOCAL_TASK 项目可以继承访问回调。要使用user_access() 默认回调,您必须将要检查的权限指定为“访问参数”。

如果您没有显示您正在使用的代码,那么下面的内容可以解释您所看到的行为。
第一个用户或用户 #1 是特定用户,因为 user_access() 始终为该用户返回 TRUE。 这在该函数的代码中很明显,它明确检查用户 ID 是否等于 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,即使您将字符串传递给函数以表示未从任何模块定义的权限。

【讨论】:

  • 假设您是对的并且这是一个权限问题,我经过身份验证的用户已经能够编辑特定的节点类型。除非有办法确定造成问题的权限,否则有没有办法在我的模块的单个部分绕过 user_access?
  • 当您定义访问回调时,用户可以根据从该函数返回的内容访问该菜单,该函数甚至无法使用user_access()。我不能再说什么,因为您没有显示用于访问回调的代码。 (显示的代码只是测试代码。)
  • 代码本质上就是我想要做的。如果您碰巧不是 UID#1,它只是没有响应。
  • 访问回调不调用die();它只是在用户可以访问菜单时返回TRUE,而在用户无权访问时返回FALSE
  • 是的,但是 die() 只是 php 代码。如果它适用于一个用户,它应该适用于另一个用户。问题是什么可能会阻止其他用户以及如何阻止它
【解决方案2】:

好吧原来答案其实很简单……

您正在调用menu_get_object() 来检索节点,但node/add/page 上不存在节点。事实上恰恰相反;在页面上有一个可用的节点来添加节点是没有意义的,因为它还没有被创建! 403 是一个副作用。

您需要根据其他一些值(通常是登录用户以及@kiamlaluno 的权限在他的回答中做了很好的解释)来做出访问决定。

另外,请确保您从访问回调中返回 TRUEFALSE,@kiamlaluno 也说过 :)

编辑

只是说这部分是对https://stackoverflow.com/questions/8342169/drupal-hook-menu-alter-menu-get-object-error的回答,这就解释了为什么这个答案中提到了问题中没有提到的功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-12-26
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-27
    相关资源
    最近更新 更多