Рейтинг:2

Как временно удалить роль пользователя?

флаг de

Мне нужно отключить роль «администратора» для учетных записей пользователей, которые входят на мой сайт из-за пределов моей сети. В целях безопасности я хочу, чтобы пользователи, у которых есть эта роль, могли использовать ее только тогда, когда они находятся в моей сети (определяется некоторым имеющимся у меня собственным PHP-кодом).

Я знаю, что могу навсегда удалить роль пользователя, используя соответствующие методы объекта, например:

<?php
используйте Drupal\user\Entity\User;

$user = User::load(\Drupal::currentUser()->id());
$user->removeRole('администратор');
$пользователь->сохранить();

Но как насчет того, чтобы сделать это временно, без постоянного обновления пользователя?

Просмотр изменений, внесенных в роли пользователя в пользовательском модуле с помощью hook_user_login() являются постоянными. В Drupal 7 я смог добиться этого, изменив глобальный $пользователь->роли в различных крючках.

Я также открыт для других способов, которыми Drupal позволяет мне удовлетворять мои потребности.

beltouche avatar
флаг cn
Возможный вариант использования https://www.drupal.org/project/restrict_by_ip?
Рейтинг:3
флаг cn

Вместо хука Drupal 7 вы можете использовать новое событие AccountEvents::SET_USER:

/src/EventSubscriber/SetAccountSubscriber.php

<?php

пространство имен Drupal\mymodule\EventSubscriber;

используйте Drupal\Core\Session\AccountEvents;
используйте Drupal\Core\Session\AccountSetEvent;
используйте Drupal\Core\Session\UserSession;
используйте Symfony\Component\EventDispatcher\EventSubscriberInterface;

/**
 * подписчик события mymodule.
 */
класс SetAccountSubscriber реализует EventSubscriberInterface {

  /**
   * Обработчик события установки учетной записи.
   *
   * @param Drupal\Core\Session\AccountSetEvent $event
   * Событие установки учетной записи.
   */
  публичная функция onAccountSet(AccountSetEvent $event) {
    $account = $event->getAccount();
    если ($account->isAuthenticated()) {
      $roles = $account->getRoles();
      если (in_array('администратор', $роли)) {
        $roles = array_values(array_diff($roles, ['администратор']));
        $аккаунт = новый UserSession([
          'uid' => $account->id(),
          'access' => $account->getLastAccessedTime(),
          'роли' => $роли,
          'имя' => $account->getAccountName(),
          'preferred_langcode' => $account->getPreferredLangcode(),
          'preferred_admin_langcode' => $account->getPreferredAdminLangcode(),
          'почта' => $account->getEmail(),
          'часовой пояс' => $account->getTimeZone(),
        ]);
        \Drupal::currentUser()->setAccount($account);
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  общедоступная статическая функция getSubscribedEvents() {
    возвращаться [
      AccountEvents::SET_USER => ['onAccountSet'],
    ];
  }

}

мой модуль.services.yml

Сервисы:
  mymodule.set_account_subscriber:
    класс: Drupal\mymodule\EventSubscriber\SetAccountSubscriber
    теги:
      - {имя: event_subscriber}  

Будьте осторожны, чтобы избежать бесконечного цикла. Последняя строка снова отправляет событие, и вам нужно условие, предотвращающее выполнение строки во второй раз, в данном случае через удаленную роль.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.