1

我需要根据 Drupal 用户的角色限制对 Drupal 站点上内容的访问。

http://site.com/managers/intro

http://site.com/managers/reviews

http://site.com/managers/up-for-raises

内容可以是多种内容类型,并且不限于一种特定的内容类型。这些内容类型将在网站的其他地方使用,因此我无法锁定整个内容类型。

我可以让所有节点/视图在创建时通过菜单设置住在这些地址,但我不知道如何通过角色限制访问,而不是 template.php 中的一堆预处理函数,但这似乎做错了。

我搜索了一个模块并在#drupal-support IRC 上进行了询问,但没有出现使用drupal 角色作为限制因素的结果。

4

4 回答 4

4

虽然这是一个老问题,但路径访问模块现在正是这样做的。以下是其项目页面的摘录:

... 为站点管理员提供了对 Drupal 站点所有页面的额外访问控制层。

好处:尽管许多 Drupal 模块提供了一定程度的访问控制权限,但它从未涵盖用户的所有可能要求。Path_access 提供了基于路径别名限制页面的方法——这意味着您可以使用通配符将某些用户角色组从站点的整个部分中锁定。

于 2010-02-05T19:30:55.523 回答
2

在我看来,如果“经理”总是出现在该部分的 URL 中,您可以编写一个小模块,用于hook_init基本上说明当前用户的角色是否不是这些指定角色之一,并且 url 包含“/managers/”,然后是 drupal_goto() 登录页面。

您也可以使用 Rules 模块轻松完成这项工作,但如果这是您使用 Rules 的唯一目的,那就不值得了。

还有很多按节点访问的模块(例如所有事物的节点访问),但是完成这样一个简单的任务也可能需要更多的努力。

于 2009-11-16T15:52:19.490 回答
1

如果我做对了,您想要实现的是只有某些角色能够访问位于给定 URL 的页面。

通过使用 CONTRIB 访问模块

正如 mcrittenden 已经提到的,有很多模块可以让您调整内容访问。其中,内容访问当然可以为所欲为,因为它允许您分别为每个节点设置权限。

通过使用标志 + 视图

另一种无需编码即可做到这一点的方法是结合flag 模块views 模块。以下是我将如何做的简要概述:

  1. 创建三个标志,您可以使用它们来标记必须在您在问题中指定的任何地址查看的内容(任何类型的内容!)(例如:创建一个标志“intro”,您将使用它来标记必须在“/mangers/intro”页面上显示的节点)
  2. 创建 3 个视图(一个用于您在问题中列出的每个地址),通过根据您的标志过滤它们来从数据库中提取您需要的节点。
  3. 根据角色设置这些视图的权限。

通过编写一个模块来检查 URI 并阻止未经授权的用户

你肯定可以做到这一点。主要优点是它在 CPU 和内存负载方面将是一个非常轻量级的解决方案,但是您必须注意一些问题。例如,您始终可以通过格式为http://example.com/node/nodenumber的 URL 访问您的内容,因此您也必须检查 URL 的别名。但还有一个事实是,用户可能会在 URL 上附加一个虚假的?something并且您必须编写正则表达式来考虑这种情况......

(mcrittenden 给出的规则模块的想法也是一个很好的想法,但我没有提到它,因为我只是在阅读他的答案时才想到它)。

希望这可以帮助!

于 2009-11-16T16:42:56.810 回答
0

您还可以研究Menu Access,它允许您在角色和菜单之间或角色和菜单树之间关联访问。(请记住,在 Drupal 中,“菜单路由器”表神秘地不仅仅是 UI,而且还是将每条内容连接到 URL 的流量路由器。)

因为所有项目都与菜单条目相关联,所以您不会遇到路径别名不一定是通用的问题。您还可以使用菜单块等模块来模拟书籍导航。

尽管该模块处于完整和推荐状态,但它似乎更接近 Alpha 或 Beta 版本,因此在生产站点上要小心。

于 2009-11-16T17:25:18.927 回答