用户如何仅访问一个特定节点,而不是该类型的所有节点?
题
我有一个用户具有视图和编辑特定内容类型的权利。这赋予所有用户的特权,以查看和编辑该类型的所有节点。但是实际上,我想为每个用户创建一个唯一的节点,以便只有该用户可以查看和编辑它。我该如何在Drupal 7中执行此操作?
解决方案
使用现有模块,您可以使用 内容访问, ,(当一起使用时 ACL)允许设置权限以访问每个用户的节点。
这意味着您需要为每个节点手动设置访问权限。
如果您手动创建节点,然后您要确保只有设置为节点所有者的用户才能查看(和编辑),则可以创建一个自定义模块(这意味着一个模块是用于您的网站),并实施 hook_node_access()
如下(已编写代码以使其更易于阅读):
function mymodule_node_access($node, $op, $account) {
// We are interested to existing objects. When the node is being created, Drupal passed the node type instead of the node object.
if (is_object($node)) {
$bool = (
($node->type == 'the node type you need to check') &&
(($op == 'view') || ($op == 'update'))
);
if ($bool) {
if ($account->uid == $node->uid) {
return NODE_ACCESS_ALLOW;
}
else {
return NODE_ACCESS_DENY;
}
}
}
return NODE_ACCESS_IGNORE;
}
使用此挂钩实现,您无需手动编辑您创建该内容类型的每个节点给出的访问权限。更改节点的所有者也会更容易,因为您不需要更改该节点的访问权限;该代码将自动授予更新,并将权限视为该节点的所有者(或作者)。
其他提示
您不需要任何特殊的模块或自定义代码来执行此操作。只需创建手动这些节点,将适当的用户设置为节点的所有者(作者),然后将权限设置为此contentype以仅编辑自己的内容(不编辑此类型的任何内容),就可以完成。
您所说的是Drupal节点访问控制,这是一个巨大的主题。
Core对节点访问控制的内置支持是相当的课程,并且要控制按角色查看节点的访问,则必须使用某种节点访问控制模块。有一个 页面drupal.org列出所有节点访问模块, ,对每个胶囊进行审查。我建议您查看该页面,看看是否可以找到合适的模块来控制访问。
这 Flexi访问 模块似乎是最接近您要求的模块,因为 主要功能 是为了让您控制单个用户的访问,而不是按角色或分类学术语来控制访问权限。
这是一个小型模块,可让您为单个用户设置ACLS(访问控制列表)。它基本上是一个用户界面 ACL 模块,因此您也需要安装它。
它缺少更高级访问控制模块的某些功能,例如 内容访问, ,但是它是积极维护的,目前在其问题队列中没有空旷的错误。
披露:我是FlexI访问的维护者。