将Drupal角色授予具有特定角色的所有用户

将Drupal角色授予具有特定角色的所有用户,drupal,Drupal,我需要将角色X自动应用于所有已被授予单独角色Y的Drupal用户。换句话说,我希望角色X是角色Y的子集。我如何做到这一点?LDAP模块允许您根据DN动态分配角色。实际上,我必须编写自己的模块,专门针对我们的系统进行定制,否则我将非常乐意与大家分享 您可以在自定义模块中实现。在“插入”和/或“更新”操作中,您将在$account->roles数组中检查角色Y。如果存在,则添加角色X(如果尚未存在)。这将确保在每次创建和/或更改用户帐户时应用您的规则 对于引导/一次性操作,请参阅。它允许您添加或删除

我需要将角色X自动应用于所有已被授予单独角色Y的Drupal用户。换句话说,我希望角色X是角色Y的子集。我如何做到这一点?

LDAP模块允许您根据DN动态分配角色。实际上,我必须编写自己的模块,专门针对我们的系统进行定制,否则我将非常乐意与大家分享

您可以在自定义模块中实现。在“插入”和/或“更新”操作中,您将在
$account->roles
数组中检查角色Y。如果存在,则添加角色X(如果尚未存在)。这将确保在每次创建和/或更改用户帐户时应用您的规则

对于引导/一次性操作,请参阅。它允许您添加或删除用户ID数组的角色。或者,您可以直接在数据库中执行此操作:

INSERT INTO users_roles (uid, rid)
  SELECT uid, [roleX_ID] AS rid FROM users_roles
    WHERE uid IN
      (SELECT uid FROM users_roles WHERE rid = [roleY_ID])
    AND uid NOT IN
      (SELECT uid FROM users_roles WHERE rid = [roleX_ID])
;

我同意Henrik Opel的观点,在定制模块中使用hook_user将是维护用户并确保用户始终处于最新状态的一个很好的解决方案

通常我不介意写SQL或类似的东西,但在这种情况下,因为它在生产站点上,我更喜欢另一种方式,因为如果在写原始SQL时容易出错,一点输入错误可能会造成很大的麻烦。另一个优点是,您可能会遇到问题,因为drupal不会知道您在数据库上运行的原始SQL,并且可能会与某些进程、挂钩和其他进程不同步,而这些进程通常是通过drupal API执行操作时运行的

相反,您可以使用drupal用户管理界面。实际上,我认为在这种情况下,这是做你想做的事情的最简单的方法。只需过滤所有学生用户。单击所有用户并为其指定成员角色。只需几次点击即可完成,而且非常安全,因为Drupal将为您处理所有SQL

更新

有这么多用户,我很惊讶您没有使用自定义用户和内容管理页面设置。只需几分钟,您就可以设置一个管理页面,用于执行批量操作,如更改用户状态、角色或为节点执行类似任务。您可以使用公开视图过滤器创建自己的过滤器。因此,只需单击几下,您就可以选择所有角色为学生且不是成员的用户,将其全部选中并向其添加成员卷。这样做的好处不仅在于它是快速安全的,而且你可以为你的网站管理员、内容创建者等创建一些好的管理页面。你应该考虑查看这个模块。角色为Y的所有用户不都有Roll X吗?我的假设正确吗?还是会有用户拥有角色Y而不是角色X?这有点违背了拥有两个不同角色的目的,因为您可以只对角色Y应用权限。所有拥有角色X的用户都将拥有角色Y,但并非所有拥有角色Y的用户都拥有角色X。角色X是角色Y的子集。具体示例:角色X是toast,角色Y是bread。所有的吐司都是面包,但不是所有的面包都是吐司。我需要给我们所有的Toast用户Toast和Bread的权限,但不是给我们所有的Bread成员Toast的权限。这真的没有意义。为什么不能将角色X拥有的所有权限以及您希望他们拥有的任何额外功能都授予角色Y呢。你是想用角色来获得权限,还是想管理其他东西?我同意这没有多大意义。我们(作为会员组织)需要向会员提供内容,但能够使用角色对会员类型(学生会员、正式会员、终身会员等)进行建模。所以我们有“会员”角色、“学生”角色和“终身”角色,我可以确保所有新注册都有通用的“会员”角色和指定其特定会员类型的角色,但到目前为止情况并非如此,所以我们目前有“学生”而不是“会员”的人,这就是我需要解决的问题。我以前使用过LDAP模块,但仅用于用户身份验证。我是否需要设置一个单独的身份验证系统,以便能够使用LDAP模块正确地建模子角色?我的经验是相当有限的,我可能是误解。请澄清。我认为LDAP与此无关。海报必须设置一个单独的LDAP服务器,这似乎有点过分。这是个好主意,我会使用这个解决方案,但我们的活跃会员人数在五位数范围内,这将需要我很多天的时间。+1-我完全同意尽可能避免直接操纵数据库-尽管由于拼写错误的风险较小(在舞台实例上对更改脚本进行严格测试应能防止这些情况发生)但这主要是因为隐含的对钩子的规避,当通过API调用更改内容时,钩子会被触发。这是钩子的一个优点,他补充道。我没有尝试过任何由于拼写错误等原因造成的问题,我的观点是,从这个意义上讲,只有少数字符需要更改才能把事情搞砸,这是很危险的。所以像这样的事情需要很多的关注=测试=时间。