hook_permission Drupal 7 不同角色的访问权限
在之前的课程中,我们已经在不同位置输出了页面和区块,并且使用了 access arguments 和 access callback 属性来设置页面访问限制。在本课中,我们将创建一种更灵活的方式,通过管理页面来编辑操作的访问权限。为此,我们将使用 hook_permission()(在 Drupal 6 中该钩子名为 hook_perm())。
hook_permission()
定义用户的权限。
该钩子可以添加权限,使您的模块能够定义哪些权限会出现在用户权限页面上。同时,该钩子还可用于控制模块执行的动作(actions)的全部或部分访问。
权限通过 user_access() 函数进行检查。
返回值
返回一个数组,其键是权限名称,对应的值是包含以下键值对的数组:
title:权限的可读名称,会显示在权限页面上。此值应使用 t() 函数包装,以便可以被翻译成其他语言。
description:(可选)描述该权限的功能。此值同样应使用 t() 函数包装以支持翻译。
restrict access:(可选)布尔值(Boolean,0 或 1,true 或 false),可以设置为 TRUE,表示站点管理员应仅将此权限授予受信任的用户。该属性应仅用于那些若被误授会造成安全隐患的权限。例如,Drupal 核心提供的“管理输入过滤器”和“完全控制节点”等权限。当设置为 TRUE 时,user_admin_permissions() 定义的标准错误信息会通过 theme_user_permission_description() 输出,并显示在管理页面的相关权限旁。默认情况下,restrict access 的值为 FALSE。
warning:(可选)为该权限在管理页面上显示一个可翻译的警告消息。该属性会覆盖通过 restrict access 自动生成的错误提示(若设置为 TRUE)。通常应尽量少用此属性,以保持所有权限的显示一致、清晰,并与其他安全提示风格保持一致。建议使用 description 来说明该权限的用途。
让我们在上节课的代码中加入此钩子:
function sitemade_permission(){ return array('view page example' => array( 'title' => t('View page example'), 'description' => t('View simple page example'), ), ); } function sitemade_menu(){ $items = array(); // 初始化菜单项数组 $items['admin/config/content/page_example'] = array( // 添加路径为 'admin/config/content/page_example' 的页面 'title' => '示例页面', // 页面标题 'description' => '普通页面', // 页面描述 'page callback' => '_page_example', // 返回页面内容的函数 'access arguments' => array('view page example'), // 设置访问权限,与 hook_permission 一致 ); return $items; // 返回页面列表 } function _page_example($content = NULL) { $content = ''; // 初始化内容变量为空 $query = db_select('node_revision', 'n'); // 选择 node_revision 表(存储节点的当前修订版本) $query->innerJoin('field_revision_body', 'b', 'b.revision_id = n.vid'); // 关联 field_revision_body 表(存储正文 body) $query->innerJoin('node', 'd', 'n.nid=d.nid'); // 关联 node 表(包含节点标题) $query->fields('n', array('title'), array('nid'), array('vid')); // 选择字段 $query->fields('b', array('body_value')); $query->condition('d.type', 'news'); // 限制为内容类型 news $query->orderBy('n.timestamp', 'DESC'); // 按时间降序排列,最新新闻在前 $query->range(0, 10); // 仅选择最近 10 条 $result = $query->execute(); // 执行数据库查询 while($nodes = $result->fetch()){ // 处理结果 $content .= '<h3>' . $nodes->title . '</h3>'; // 输出标题 $content .= $nodes->body_value; // 输出正文 } return $content; // 返回内容 }
现在在权限页面 admin/people/permissions 上会出现一个新的权限:
仅为管理员勾选此权限,以防普通用户访问该页面。这样,当普通用户尝试访问 admin/config/content/page_example 页面时,Drupal 会返回 403 拒绝访问错误。
在下一课中,我们将创建一个带有站点设置选项的管理页面表单,使用 Drupal Forms API 实现。