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 中的视图并编辑名为“用户:批量更新(批量更新)”的字段。在出现的对话框中,将“可用操作”选项选择为“仅选定的操作”,然后确保未选择角色更新操作。我网站上的表格是这样的。 

 

 

有了这些元素,您将拥有一个更加锁定的用户管理区域,而无需维护太多代码。你唯一需要注意的是确保你的角色和权限被仔细堆叠,这样用户就不能给自己一个角色来授予他们“管理员权限”权限。这不是一个巨大的安全漏洞,因为您需要允许用户