จะตรวจสอบได้อย่างไรว่าผู้ใช้เป็นผู้ใช้ขั้นสูง?


20

เพื่อตรวจสอบว่าผู้เข้าชมเป็นแขกเราใช้สิ่งนี้:

if ($user->guest) {
echo 'Hello, guest!';
}

ตอนนี้ถ้าฉันต้องการที่จะตรวจสอบว่าผู้เข้าชมเป็น SuperUser (ผู้ดูแลระบบ) ที่ลงทะเบียนหรือไม่สิ่งที่จะเป็นรหัสสำหรับที่?

ฉันมีไฟล์ PHP ภายนอกที่ฉันไม่ต้องการให้ใครเข้าถึงได้ยกเว้น SuperUsers ของเว็บไซต์ Joomla ของฉัน เพียงแค่พยายามรักษาความปลอดภัยของไฟล์โดยการนำเข้า Joomla CMS


1
ตลกฉันต้องการเมื่อคืนนี้และเพิ่ง googled จนกระทั่งฉันพบวิธีแก้ปัญหา ในกรณีของฉันฉันกำลังเอาชนะผลลัพธ์จาก RSFiles ดังนั้นแถบเครื่องมือจะแสดงเฉพาะผู้ดูแลระบบเท่านั้น
Brian Peat

1
ที่จริง $ user-> get ('isRoot') ซึ่งอยู่ในคำตอบที่ยอมรับไม่ควรใช้ มีแนวโน้มมากที่สุดในรุ่น Joomla ล่าสุด (3.6 ขึ้นไป) มันจะไม่ทำงานเมื่อมีการเรียกเช่นนี้นอกเหนือจาก JUser :: authorize () ใช้ $ user-> อนุญาต ('params ของคุณที่นี่') แทนเช่นคำตอบของ dev-m
FFrewin

คำตอบ:


28

รหัสเหล่านี้จะตรวจสอบว่าผู้ใช้ที่เข้าสู่ระบบในปัจจุบันเป็นผู้ใช้ super หรือไม่ -

$user = JFactory::getUser();
$isroot = $user->authorise('core.admin');

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


2
คำอธิบายในคำตอบนี้เป็นบิตอ่อนแอ แต่ผมคิดว่าเป็นสิทธิ์ดีกว่าที่จะตรวจสอบกว่าcore.admin core.edit
Brilliand

1
ฉันไม่เห็นด้วย. core.admin เป็นสิทธิ์ที่ใช้ในการควบคุมการเข้าถึงการกำหนดค่าส่วนกลางดังนั้นจึงเป็นวิธีที่เหมาะสมในการตรวจสอบว่าผู้ใช้เป็นผู้ดูแลระบบขั้นสูงหรือไม่ ถ้าคุณตรวจสอบกลุ่ม 8 เช่นคำตอบที่ยอมรับถ้า Joomla! เคยตัดสินใจที่จะสุ่มมันเพื่อความปลอดภัยสคริปต์ของคุณจะแตก รหัสด้วยการเปลี่ยนแปลงในใจเสมอ นอกจากคุณจะไม่ตั้งใจอัพเกรด
Mathew Lenning

นี่คือการจับคู่ที่ดีที่สุดสำหรับการตรวจสอบ SuperUser อย่างชัดเจน มันจะตรวจสอบทั้งสองสำหรับความล้มเหลวและการอนุญาต SuperUser github.com/joomla/joomla-cms/blob/staging/lไลบรารี/joomla/user/…อีกทางเลือกหนึ่งคือ $ user-> get ('isRoot') ซึ่งถือว่าการอนุญาตนั้นถูกใช้เพื่อเติมข้อมูลสถานะ isRoot isRoot สามารถใช้ได้โดยตรงเนื่องจากเป็นคุณสมบัติที่ได้รับการป้องกัน github.com/joomla/joomla-cms/blob/staging/administrator/…
Peter Wiseman

เพียงแค่เคลียร์ข้อสงสัยใด ๆ ว่ารหัสนี้ถูกต้องหรือไม่: รหัสนี้ใช้ในหลักของ Joomla (Joomla 3.5.1) เพื่อตรวจสอบว่าผู้ใช้นั้นเป็นผู้ดูแลระบบระดับสูงหรือไม่ คุณสามารถค้นหาได้ในบรรทัด 747 ของlibraries/joomla/user/user.phpไฟล์ มันคืออันนี้:$iAmSuperAdmin = $my->authorise('core.admin');
itoctopus

8

เพื่อตรวจสอบสถานะ "ซูเปอร์ผู้ใช้" $user->isRootคุณต้องตรวจสอบ คุณสมบัตินี้ถูกตั้งค่าหลังจากการตรวจสอบสิทธิ์ครั้งแรกเสร็จสิ้นและตรวจพบผู้ใช้ว่าเป็นผู้ดูแลระบบขั้นสูง

อย่างไรก็ตามโดยปกติแล้วคุณต้องการตรวจสอบว่าผู้ใช้มีการอนุญาตที่แน่นอนเช่นคำอธิบายอื่น ๆ หรือไม่


3
สิ่งนี้ถือว่า $ user-> authorize () ถูกเรียกโดยอย่างอื่นเพื่อเติมคุณสมบัติ isRoot นอกจากนี้โปรดทราบว่าคุณสมบัติ isRoot ได้รับการคุ้มครองดังนั้นจำเป็นต้องเข้าถึงผ่านทาง $ user-> get ('isRoot')
Peter Wiseman

6

ลองนี้

$user  = JFactory::getUser();

$user_groups = $user->groups;

print_r($user_groups);

สิ่งนี้จะส่งคืนอาร์เรย์โดยค่าเริ่มต้นผู้ใช้ Joomla Admin Super Admin (กลุ่ม 8) และผู้ดูแลระบบ (กลุ่ม 7)

คุณสามารถตรวจสอบอาร์เรย์ที่มีค่าใด ๆ เหล่านี้ได้ซึ่งควรเป็นผู้ใช้ที่เป็นผู้ดูแลระบบหากคุณสร้างกลุ่มผู้ใช้ที่กำหนดเองคุณก็ต้องตรวจสอบ#__usergroups parent Idด้วย

หวังว่ามันจะช่วย ..


6

คุณสามารถใช้เงื่อนไขเพื่อปฏิเสธการใด ๆ ที่ไม่ได้อยู่ในกลุ่มเฉพาะ

$user = JFactory::getUser();
$groups = $user->groups;

if (in_array(8, $groups)):

 //only enter if the user is in the group 8 (group 8 = Super-Administrator)

endif;

1
เลขเวทย์ไม่ใช่ทางออกที่ดี คุณสามารถให้สิทธิ์ Super Admin กับกลุ่มใด ๆ และ / หรือลบกลุ่ม Super Admin ที่เป็นค่าเริ่มต้น
David Hayes

ฉันใช้สิ่งที่ชอบif(in_array(8, $user->groups))และทำงานให้ฉัน
Linga

4

ลองรหัสด้านล่างเพื่อตรวจสอบว่าผู้ใช้ที่เข้าสู่ระบบเป็นผู้ดูแลระบบ super หรือผู้ใช้อื่น ๆ ...

$user = JFactory::getUser();
$isAdmin = $user->get('isRoot');
if ($isAdmin) {
echo 'You are an Administrator';
}
else  {
echo 'You are not Administrator';
}

OR

function isSuperAdmin()
{
  $user = JFactory::getUser();
  return $user->get('isRoot');
}    

if (isSuperAdmin()) 
{
  echo 'You are an Administrator';
}
else  {
  echo 'You are not Administrator';
}

1
ไม่ควรใช้ $ user-> get ('isRoot') จริง ๆ มีแนวโน้มมากที่สุดในรุ่น Joomla ล่าสุด (3.6 ขึ้นไป) มันจะไม่ทำงานเมื่อมีการเรียกเช่นนี้นอกเหนือจาก JUser :: authorize () ใช้ $ user-> อนุญาต ('params ของคุณที่นี่') แทนเช่นคำตอบของ dev-m
FFrewin

ฉันจะทดสอบก่อนขอบคุณที่ชี้ให้เห็น :)
saibbyweb

1
$user->get('isRoot');ไม่ทำงานสำหรับ J3.6.2
saibbyweb

2

Joomla @since 3.2, ฟิลด์ UserGroupList ใช้สิ่งนี้เพื่อตรวจสอบ:

$isSuperUser = JFactory::getUser()->authorise('core.admin');

คำตอบนี้คล้ายกับคำตอบของ @ dev-mมาก
Farahmand

@Farahmand คุณพูดถูกฉันเพิ่งเพิ่มเพื่อยืนยันว่า Joomla คือวิธีใดที่ต้องการและยังคงใช้ได้สำหรับรุ่น Joomla 3+
Pedro Bicudo Maschio

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