Score:2

จะลบบทบาทของผู้ใช้ชั่วคราวได้อย่างไร

ธง de

ฉันจำเป็นต้องปิดใช้งานบทบาท "ผู้ดูแลระบบ" จากบัญชีผู้ใช้ที่เข้าสู่ระบบเว็บไซต์ของฉันจากภายนอกเครือข่ายของฉัน เพื่อความปลอดภัย ฉันต้องการให้ผู้ใช้ที่มีบทบาทนี้ใช้งานได้เมื่ออยู่ในเครือข่ายของฉันเท่านั้น (กำหนดโดยโค้ด PHP แบบกำหนดเองที่ฉันมี)

ฉันรู้ว่าฉันสามารถลบบทบาทออกจากผู้ใช้อย่างถาวรโดยใช้วิธีการเอนทิตีที่เหมาะสมดังนี้:

<?php
ใช้ Drupal\user\Entity\User;

$user = User::load(\Drupal::currentUser()->id());
$user->removeRole('ผู้ดูแลระบบ');
$user->save();

แต่จะทำอย่างไรชั่วคราวโดยไม่อัปเดตผู้ใช้อย่างถาวร

ดูการเปลี่ยนแปลงที่เกิดขึ้นกับบทบาทของผู้ใช้ในโมดูลที่กำหนดเองโดยใช้ hook_user_login() เป็นแบบถาวร ใน Drupal 7 ฉันสามารถบรรลุสิ่งนี้ได้โดยการปรับเปลี่ยนโกลบอล $user->บทบาท ในตะขอต่างๆ

ฉันยังเปิดรับวิธีอื่นๆ ที่ Drupal ช่วยให้ฉันตอบสนองความต้องการได้

beltouche avatar
cn flag
กรณีการใช้งานที่เป็นไปได้สำหรับ https://www.drupal.org/project/restrict_by_ip?
Score:3
ธง cn

แทนที่จะใช้ Drupal 7 hook คุณสามารถใช้เหตุการณ์ 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 $เหตุการณ์
   * เหตุการณ์ชุดบัญชี
   */
  ฟังก์ชั่นสาธารณะ onAccountSet (AccountSetEvent เหตุการณ์ $) {
    $account = $event->getAccount();
    ถ้า ($account->isAuthenticated()) {
      $roles = $account->getRoles();
      ถ้า (in_array ('ผู้ดูแลระบบ' $ บทบาท)) {
        $บทบาท = array_values(array_diff($บทบาท, ['ผู้ดูแลระบบ']));
        $account = เซสชันผู้ใช้ใหม่([
          'uid' => $account->id(),
          'การเข้าถึง' => $account->getLastAccessedTime(),
          'บทบาท' => $บทบาท,
          'ชื่อ' => $account->getAccountName(),
          'preferred_langcode' => $account->getPreferredLangcode(),
          'preferred_admin_langcode' => $account->getPreferredAdminLangcode(),
          'mail' => $account->getEmail(),
          'เขตเวลา' => $account->getTimeZone(),
        ]);
        \Drupal::currentUser()->setAccount($บัญชี);
      }
    }
  }

  /**
   * {@inheritdoc}
   */
  ฟังก์ชั่นคงที่สาธารณะ getSubscribedEvents () {
    กลับ [
      เหตุการณ์บัญชี::SET_USER => ['onAccountSet'],
    ];
  }

}

mymodule.services.yml

บริการ:
  mymodule.set_account_subscriber:
    คลาส: Drupal\mymodule\EventSubscriber\SetAccountSubscriber
    แท็ก:
      - { ชื่อ: event_subscriber }  

ระมัดระวังเพื่อหลีกเลี่ยงการวนซ้ำไม่สิ้นสุด บรรทัดสุดท้ายส่งเหตุการณ์อีกครั้ง และคุณต้องมีเงื่อนไขที่ป้องกันไม่ให้ดำเนินการรายการเป็นครั้งที่สอง ในกรณีนี้ผ่านบทบาทที่ถูกลบ

โพสต์คำตอบ

คนส่วนใหญ่ไม่เข้าใจว่าการถามคำถามมากมายจะปลดล็อกการเรียนรู้และปรับปรุงความสัมพันธ์ระหว่างบุคคล ตัวอย่างเช่น ในการศึกษาของ Alison แม้ว่าผู้คนจะจำได้อย่างแม่นยำว่ามีคำถามกี่ข้อที่ถูกถามในการสนทนา แต่พวกเขาไม่เข้าใจความเชื่อมโยงระหว่างคำถามและความชอบ จากการศึกษาทั้ง 4 เรื่องที่ผู้เข้าร่วมมีส่วนร่วมในการสนทนาด้วยตนเองหรืออ่านบันทึกการสนทนาของผู้อื่น ผู้คนมักไม่ตระหนักว่าการถามคำถามจะมีอิทธิพลหรือมีอิทธิพลต่อระดับมิตรภาพระหว่างผู้สนทนา