我需要自动将角色X应用于已被授予单独角色的所有Drupal用户,角色Y.换句话说,我希望角色X成为角色Y的子集。我该怎么办?此?
答案 0 :(得分:4)
您可以在自定义模块中实施hook_user()
。在“插入”和/或“更新”操作中,您将检查$account->roles
数组中的角色Y.如果存在,添加角色X(如果尚未添加)。这将确保每次创建和/或更改用户帐户时都会应用您的规则。
对于自举/一次性操作,请查看user_multiple_role_edit()
。它允许您为用户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])
;
答案 1 :(得分:1)
我同意Henrik Opel在自定义模块中使用hook_user是一个很好的解决方案,可以维护用户并确保它们始终是最新的。
通常我不介意编写SQL或类似的东西,但在这种情况下,因为它在生产站点上,我宁愿选择不同的路由,因为如果在编写原始SQL时容易出错,那么可能会有一些错字造成很大麻烦。另一个好处是你可能会遇到问题,因为drupal不会意识到你在数据库上运行的原始SQL,并且可能与通过Drupal API执行操作时通常运行的某些进程,挂钩和其他进程不同步。
相反,您可以使用drupal用户管理界面。我实际上认为在这种情况下,它是最简单的方式来做你想要的。只需过滤所有学生用户。单击所有用户并为其指定成员角色。只需点击几下即可完成此操作,并且非常安全,因为Drupal将为您处理所有SQL。
<强>更新强>
有了这么多用户,我很惊讶您没有使用views_bulk_operations设置自定义用户和内容管理页面。使用几分钟,您可以设置一个管理页面,您可以使用该页面来执行批量操作,例如更改用户状态,角色或执行节点的类似任务。您可以使用公开的视图过滤器创建自己的过滤器。因此,只需点击几下,您就可以选择具有学生角色且不是成员的所有用户,选择所有用户并将成员资料添加到他们。这样做的好处不仅在于它的快速和安全,而且还可以为您的站点管理员,内容创建者等创建一些不错的管理页面。您应该考虑查看此模块。
答案 2 :(得分:-2)
LDAP模块允许您根据DN动态分配角色。我实际上必须编写专门针对我们系统定制的模块,否则我会非常乐意分享它。