让视图尊重hook_node_access


14

hook_node_access()用来拒绝用户基于自定义条件访问某些节点。但是,如果用户未通过标准,我不希望此内容显示在列出该内容的视图中。有什么方法可以让观点尊重hook_node_access()实现?


如果Views模块不真正尊重通过设置的访问权限hook_node_access(),则应该做的一件事情:更改Views模块代码。
kiamlaluno

我不认为钩子要等到节点实际上全部用node_load加载后才被触发,这可能就是为什么它仍然显示出来的原因。但是,我已经开始研究过滤器插件,该插件将使用与hook_node_access()的实现用于将人拒之门外的相同方法进行过滤。我只需要记住在所有视图中添加该过滤器,它应该可以工作。完成后,我将在此处提供有关信息,以便其他人受益。
nenne 2012年

好的,所以我的用例是:客户希望对任何节点都适用10级访问权限,并且用户应该能够看到所有节点的访问级别。对于标准节点视图,可以通过hook_node_access轻松解决此问题。但是,由于视图不尊重这一点,我使用自定义php代码为该参数创建了上下文过滤器。php代码基本上返回小于或等于用户访问级别的值(以,分隔为正确的语法)。该解决方案的缺点是每个视图都需要此配置。
nenne 2012年

我发现了一个可以解决该问题的观点问题,它还涉及解决问题的正确方法:drupal.org/node/1266388
nenne 2012年

2
如果您可以写出解决问题的答案,那是完全可以接受的;正如merlinofchaos所说,“视图”模块正在使用数据库查询来加载节点,这就是为什么hook_node_access()不尊重实现的原因。由于这是“设计使然”的,因此报告解决方法很好。
kiamlaluno

Answers:


6

前段时间我在这里有同样的问题。

hook_node_accessviews或无法识别menus。它只能用作最后一道防线。

更好的控制节点访问的方法是通过hook_node_access_recordshook_node_grants如此此处所述



1

视图使用SQL确定要显示的节点。遗憾的是,出于性能方面的考虑,Drupal对所有可能的候选对象执行node_load,然后对所有候选对象都调用hook_node_access完全是不可行的。想象一下一个视图,其中显示了数千个节点(尤其是在使用寻呼机时)。如果逻辑未在SQL中完成,则传呼机将具有非常不寻常的功能,因此Drupal会像rik所提到的那样使用数据库中的访问记录来强制您执行此操作。

进行access_records的工作量还很多,但可以使其与SQL一起使用。因此,我建议尽可能使用现有的node_access模块​​来解决您的功能,因为它可能会使用访问记录来实现,因此可以与视图一起使用。

通过以下方式将访问记录存储在表node_access表中: 在此处输入图片说明 通过每列的注释,您可以了解它们的用途。将领域视为用于节点访问的系统,将gid视为领域内的组。该组可以具有查看,更新和删除权限。通常,每个node_access模块​​都定义一个或多个领域(有时,多个node_access模块​​也可以并行工作)。用户在每个领域中都有一个或多个gid。

在Drupal中,所有带有“ node_access”标签的查询将自动添加一些特殊的逻辑。请参阅文档以了解有关标记的更多信息。此特殊逻辑将每个领域的“ node_access”表联接在一起,并添加以下条件:“ gid”等于应用于用户的一个gid时,该用户具有适当的权限。

整个系统允许所有查询正确处理node_access,甚至还可以对查询进行计数等。它非常强大,但是具有比简单的hook_node_access更高的学习曲线。只要有可能,使用现有的node_access模块​​都可以为您省去很多麻烦。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.