ตรวจสอบว่าผู้ใช้มีบทบาทหรือไม่


46

ฉันจะตรวจสอบว่าผู้ใช้มีบทบาทที่แน่นอนได้อย่างไร

ฉันพบสิ่งนี้แต่มันมีไว้สำหรับ Drupal 6

คำตอบ:


87

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

ที่กล่าวว่าหากคุณต้องการตรวจสอบบทบาทคุณสามารถทำสิ่งนี้:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role.
if (in_array('editor', $user->roles)) {
  // do fancy stuff
}

1
จะทำอย่างไรถ้าฉันต้องการตรวจสอบมากกว่า 1 บทบาท เช่นถ้า "บรรณาธิการ" หรือ "ผู้เผยแพร่" มากกว่าทำสิ่งแฟนซี วิธีการรหัส กรุณาแนะนำ คิดไม่ออกจริงๆ
Adamtan

8
โปรดอ่านคำตอบ: ไม่แนะนำให้ตรวจสอบบทบาท (หรือมากกว่าหนึ่ง) ตรวจสอบการอนุญาตแทน คำถามที่เหลือของคุณ (รวมสองเงื่อนไขในคำสั่ง if) เป็น PHP ขั้นพื้นฐานไม่มีอะไรเกี่ยวข้องกับ Drupal อ่านเอกสาร PHP บนดำเนินการทางตรรกะ
marcvangend

11

ในการตรวจสอบว่าผู้ใช้ปัจจุบันมีบทบาทเดียวหรือหลายบทบาทจะต้องทำอย่างไร:

//can be used in access callback too
function user_has_role($roles) {
    //checks if user has role/roles
    return !!count(array_intersect(is_array($roles)? $roles : array($roles), array_values($GLOBALS['user']->roles)));
};

if (user_has_role(array('moderator', 'administrator'))) {
  // $user is admin or moderator
} else if(user_has_role('tester')){
  // $user is tester
} else{
  // $user is not admin and not moderator
}

9

อัปเดตสำหรับรุ่น Drupal> = 7.36

คุณสามารถใช้ฟังก์ชั่น user_has_role จาก Drupal API https://api.drupal.org/api/drupal/modules%21user%21user.module/function/user_has_role/7

ลองตัวอย่างนี้:

<?php
function MYMODULE_foo() {
  $role = user_role_load_by_name('Author');
  if (user_has_role($role->rid)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }

  $user = user_load(123);

  if(user_has_role($role->rid, $user)) {
    // Code if user has 'Author' role...
  }
  else {
    // Code if user doesn't have 'Author' role...
  }
}
?>

2

คุณสามารถติดตั้งโมดูล devel และทำ dpm ($ user) สิ่งนี้จะพิมพ์อาร์เรย์ที่มีข้อมูลผู้ใช้ทั้งหมดรวมถึงบทบาทผู้ใช้

จากอาเรย์นี้คุณสามารถค้นหาตำแหน่งอาเรย์ของ "บทบาท" และใช้มันในโมดูลของคุณเพื่อค้นหาบทบาทผู้ใช้


ภายใต้การพัฒนา -> เรียกใช้งานโค้ด PHP ให้ป้อน: global $ user; DPM ($ ผู้ใช้);
diamondsea

1

การเป็น Futureproof ในกรณีที่ชื่อบทบาทเปลี่ยนเป็นการดีที่สุดที่จะตรวจสอบ ID บทบาท (กำจัด) ซึ่งสามารถพบได้ในตารางบทบาทในฐานข้อมูล

หากคุณต้องการตรวจสอบบทบาทที่มีการกำจัด 16 ให้ทำ:

// Load the currently logged in user.
global $user;

// Check if the user has the 'editor' role, when 'editor' has role id 16
if (array_key_exists(16, $user->roles)) {
  // do fancy stuff
}

1
ที่จริงแล้วเมื่อคุณย้ายสิ่งต่าง ๆ เช่นบทบาทชื่อเครื่องจะถูกเก็บไว้และ ID จะไม่
Mołot

ไม่มีชื่อเครื่องเพียงแค่กำจัดและชื่อบุคคลในตารางบทบาท ตาราง users_roles กำหนด uid ให้เป็นการลบ
Hans Rossel

1

นี่คือรหัสจริงจากความคิดเห็นที่อ้างถึงในคำตอบที่ยอมรับว่าเป็นแนวทางปฏิบัติที่ดีที่สุด

<?php
  function mymodule_perm() {
    return array('access something special');
  }

  function dosomethingspecial() {
    // For current user
    if (user_access('access something special')) {
      // Doing something special!
    }

    // For a specific user
    if (user_access('access something special', $theuser)) {
      // Doing something special!
    }
  }
?>

0

คุณสามารถตรวจสอบบทบาทของผู้ใช้โดย print_r ($ user) และในผลลัพธ์คุณจะได้รับสิ่งนี้

วัตถุ stdClass
(
    [uid] => 0
    [hostname] => :: 1
    [role] => Array
        (
            [1] => ผู้ใช้ที่ไม่ระบุชื่อ // การกำหนดบทบาทผู้ใช้ปัจจุบันไม่ระบุชื่อในกรณีของคุณมันอาจแตกต่างกัน
        )

0

เพื่อตรวจสอบว่าผู้ใช้มีบทบาทที่แน่นอน:

function test_role(){
   global $user;
   if(isset($user->roles['my_role'])){
     return true;
   }
   else {
    return false;
 }
}


0

คำตอบข้างต้นไม่ได้ผลไม่แน่ใจฉันพบโพสต์นี้และรหัสควรเป็น `

// ตรวจสอบเพื่อดูว่าผู้ใช้ $ มีบทบาทผู้ดูแลระบบหรือไม่ if (in_array ('administrator', array_values ​​($ user-> role))) {// ทำอะไรบางอย่าง }?> `

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.