Drupal 8:防止用户角色提升
Drupal 的用户权限系统有一个小缺陷,它允许用户给自己或其他用户分配他们不应该拥有的角色。如果用户具有“管理员用户”权限,这实际上使他们可以更改系统上任何用户的角色,这意味着他们可以对系统上的任何用户进行高级管理员访问。
对此的修复涉及几个操作。
第一个以从最少权限(即匿名)到最多权限的非常具体的顺序设置用户角色。这实际上是 Drupal 开箱即用的默认设置方式,但请确保在添加更多角色时保持此顺序。这是一个典型的 Drupal 角色管理屏幕,其中设置了一些其他权限。
第二个是创建一个钩子,如果用户没有“管理员权限”权限,它将改变用户编辑屏幕并隐藏用户的角色。使用此代码,用户仍然可以访问用户编辑屏幕并更改用户角色,但他们无法为任何用户授予高于他们自己角色的角色。
/*** Implements hook_form_FORM_ID_alter().
*/
function my_module_form_user_form_alter(&$form, FormStateInterface $form_state) {
// 获取当前用户及其角色(减去“已认证”)。
$user = \Drupal::currentUser();
$userRoles = $user->getRoles(TRUE);
if ($user->hasPermission('administer permissions')) {
// 不要在这里做任何事情,因为用户拥有正确的权限。
return;
}
// 从表单中提取角色选项。
$options = $form['account']['roles']['#options'];
$removeRole = FALSE;
// 删除高于用户的任何角色。
foreach ($options as $rid => $option) {
if ($removeRole == TRUE) {
unset($options[$rid]);
}
if (in_array($rid, $userRoles)) {
$removeRole = TRUE;
}
}
// 将选项放回表单中。
$form['account']['roles']['#options'] = $options;
$form['account']['roles']['#access'] = $user->hasPermission('administer user roles');
}
最后一步是从 People 管理视图中删除用户角色添加和删除操作。为此,请编辑路径 /admin/structure/views/view/user_admin_people 中的视图并编辑名为“用户:批量更新(批量更新)”的字段。在出现的对话框中,将“可用操作”选项选择为“仅选定的操作”,然后确保未选择角色更新操作。我网站上的表格是这样的。
有了这些元素,您将拥有一个更加锁定的用户管理区域,而无需维护太多代码。你唯一需要注意的是确保你的角色和权限被仔细堆叠,这样用户就不能给自己一个角色来授予他们“管理员权限”权限。这不是一个巨大的安全漏洞,因为您需要允许用户
以上是 Drupal 8:防止用户角色提升 的全部内容, 来源链接: utcz.com/z/327484.html