You are here

访问控制

g089h515r806 的头像
Submitted by g089h515r806 on 星期日, 2009-08-02 14:26

到目前为止,在前面的所有例子中,我们都简单的将菜单项的access callback键设置为了TRUE,这意味着所有的用户都可以访问我们的菜单。一般情况下,通过在模块中使用hook_perm()来定义权限,并使用一个函数来测试这些权限,从而实现对菜单的访问控制。这里所用的函数的名字定义在菜单项的access callback键中,它一般为user_access。让我们定义一个名为receive greeting的权限;如果用户没有哪个角色具有该权限的话,当他/她访问页面http://example.com/?q=menufun时,将会收到一个“拒绝访问”消息。

 
/**
* Implementation of hook_perm().
*/
function menufun_perm() {
    return array('receive greeting');
}
 
/**
* Implementation of hook_menu().
*/
function menufun_menu() {
    $items['menufun'] = array(
        'title' => 'Greeting',
        'page callback' => 'menufun_hello',
       'access callback' => 'user_access',
       'access arguments' => array('receive greeting'),
        'weight' => -10,
    );
    $items['menufun/farewell'] = array(
        'title' => 'Farewell',
        'page callback' => 'menufun_goodbye',
    );
 
    return $items;
}
 
 
    在前面的代码中,是根据user_access('receive greeting')的返回结果来判定是否允许访问的。这样,菜单系统就相当于一个门卫,它会基于用户的角色来判定哪些路径可以访问,哪些路径不可以访问。
 
提示 user_access()函数是默认的访问回调。如果你没有定义访问回调的话,那么访问参数将被菜单系统传递给user_access()。
 
    子菜单一般不会继承父菜单项的访问回调和访问参数。所以必须为每个菜单项定义access arguments键。如果访问回调不是user_access的话,那么还需要定义access callback键。不过也有例外,那就是类型为MENU_DEFAULT_LOCAL_TASK的菜单项,它可以继承父菜单项的访问回调和访问参数,不过为了清晰起见,对于这些默认的本地任务菜单项,最好能够为其明确的定义这些键。
 老葛的Drupal培训班 Think in Drupal

Drupal版本:

评论

thomasfan 的头像

$items['menufun/farewell'] = array(
  'title' => 'Farewell',
  'page callback' => 'menufun_goodbye',
  'access arguments' => array('receive greeting'),
);

如果没有添加这一行,那么Farewell子菜单将会隐藏无法显示。

biglazy 的头像

确实这些都是官方的勘误。

具体这个例子是在:http://www.drupalbook.com/errata2?page=1 底部最下方 。

-----------------------------------------------------------------

不过把那行注释了与不注释,用普通用户怎么没发现什么差别,子菜单都能显示。

 好了,如果那行没有的话,确实子菜单无法显示;多rebuild menus 和 empty chche 几次之后,子菜单果真不见了。

(继承的特性已经在某个版本中取消了。)