老葛的Drupal培训班 Think in Drupal
一个授权ID是一个标识符,用于为一个给定领域,提供节点访问控制权限方面的信息。例如,一个节点访问控制模块----比如forum_access.module,它根据用户角色,来管理对论坛类型节点的访问----可以使用角色ID作为授权ID。一个使用US ZIP代码来管理对节点访问的模块,可以使用ZI P代码作为授权ID。在每种情况下,都是用与用户有关的东西作为授权ID,比如该用户拥有这个角色么?这个用户的ZIP是12345么?用户是在这个访问控制列表中么?或者,这个用户定阅的时间超过1年了么?
节点访问模块为包含授权ID的领域提供了授权ID,尽管每个授权ID都特定于它的节点访问模块,但是它们的底层原理是一样的,那就是在node_access表中,如果存在一条包含了授权ID的记录的话,那么就启用访问,访问的类型则可以通过grant_view, grant_update, 或者grant_delete列中,值为1的那个进行判定.
在一个节点正在保存时,会将授权ID插入到表node_access中。将这个节点对象传递给实现了钩子hook_node_access_records()的每个模块。模块将检查节点,或者简单的返回(如果它不用为该节点处理访问控制),或者返回一个数组,里面包含了用于插入到表node_access中的授权。使用node_access_acquire_grants()可以批量的插入授权。下面是一个来自于forum_access.module的例子。
/**
* Implementation of hook_node_access_records().
*
* Returns a list of grant records for the passed in node object.
*/
function forum_access_node_access_records($node) {
...
if ($node->type == 'forum') {
$result = db_query('SELECT * FROM {forum_access} WHERE tid = %d', $node->tid);
while ($grant = db_fetch_object($result)) {
$grants[] = array(
'realm' => 'forum_access',
'gid' => $grant->rid,
'grant_view' => $grant->grant_view,
'grant_update' => $grant->grant_update,
'grant_delete' => $grant->grant_delete
);
}
return $grants;
}
}