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

回到顶部