จะ จำกัด การเข้าถึงมุมมององค์ประกอบที่กำหนดเองได้อย่างไร


11

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

ตอนนี้ปัญหาเกิดขึ้นถ้ามีคนพยายามที่จะเข้าถึง URL ที่มี option = com_mycomponent โดยตรงหรือการเปลี่ยนเส้นทางภายในขององค์ประกอบของฉันไปที่หน้าโดยไม่มี Itemid ที่ได้รับมอบหมาย ... ในกรณีนั้นมันเป็นองค์ประกอบที่ต้องการ เพื่อตรวจสอบกลุ่มผู้ใช้และตรวจสอบว่าสามารถดูหน้านั้น ... ฉันจะ จำกัด ได้อย่างไรในรหัสของฉัน? เพียงแค่ตรวจสอบฮาร์ดโค้ดที่ตรวจสอบกลุ่มผู้ใช้ของผู้ใช้หรือไม่ หรือมีวิธี "มาตรฐาน" สำหรับการทำมัน?

ฉันตรวจสอบเอกสารแล้วและพบสิ่งนี้:

http://docs.joomla.org/J2.5:How_to_implement_actions_in_your_code

แต่นั่นเป็นสิ่งที่ผู้ใช้สามารถทำได้ไม่ใช่สิ่งที่ผู้ใช้สามารถเห็นได้ ฉันได้ค้นพบฟอรัมนี้ด้วย:

http://forum.joomla.org/viewtopic.php?t=530721

รหัสที่จุดเริ่มต้นค่อนข้างเก่า แต่ท้ายที่สุดแนะนำให้ใช้สิ่งนี้:

http://api.joomla.org/cms-3/classes/JUser.html#method_authorise

ฉันจะดำเนินการเพื่อสิ่งนั้นได้อย่างไร ฉันควรกำหนดเนื้อหาสำหรับวัตถุหลักที่สร้างโดยมุมมองของฉันเพื่อให้ฉันสามารถทดสอบการเข้าถึงด้วย JUser ได้หรือไม่

ขอบคุณล่วงหน้า.

คำตอบ:


9

คุณสามารถสร้างปลั๊กอินระบบเพื่อจัดการการร้องขอทั้งหมดไปยังองค์ประกอบที่กำหนดเองของคุณก่อนที่จะส่งการควบคุมไปยังองค์ประกอบ

ใช้เหตุการณ์onAfterRouteเพื่อทำการตรวจสอบการเข้าถึงทั้งหมด

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

  $jinput = JFactory::getApplication()->input;
  $option = $jinput->get('option', '');
  $view   = $jinput->get('view', '');

  // place USER-GROUP related checking here
}

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

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

4

นี่คือรหัสที่คุณต้องใช้ในการเริ่มต้นด้วยการแสดงวิธีดูกลุ่มที่ผู้ใช้อยู่

$user = JFactory::getUser();
$groups = $user->groups;
if($user->id) {
    echo $user->username.' is logged in<Br/>';
    if (isset($groups[8])) echo " - User is a Super User <Br/>";
    if (isset($groups[7])) echo " - User is an Administrator <Br/>";
    if (isset($groups[6])) echo " - User is an Manager <Br/>";
}else{
    echo 'Not logged in<Br/>';
}

ขอบคุณ GDP ส่วนนี้มากหรือน้อยอยู่ภายใต้การควบคุม ดังนั้นฉันจึงเข้าใจ "วิธีที่ถูกต้อง" ที่จะใช้มันในทุกมุมมอง
Isidro Baquero

คุณจะต้องยกเว้นกรณีที่คุณต้องการ จำกัด การดูทั้งหมดซึ่งในกรณีนี้คุณจะต้องตั้งค่าพารามิเตอร์บางส่วนหรือฟังก์ชั่นตัวช่วยที่ใช้สำหรับทุก ๆ fiew
GDP

น่าสนใจ ... ฉันจะไปค้นคว้าข้อมูลเกี่ยวกับการ จำกัด มุมมองผ่านพารามิเตอร์องค์ประกอบได้อย่างไร ขอบคุณอีกครั้ง!
Isidro Baquero

ดูเหมือนคุณอาจต้องการเรียนรู้เกี่ยวกับ Joomla ACL เช่นกัน แต่ฉันสามารถแนะนำ Google เพื่อการวิจัยเท่านั้นหรือลองใช้องค์ประกอบ aa ที่ component-creator.com และดูว่ามันทำงานอย่างไรทั้งหมด รหัสที่สร้างขึ้นของพวกเขารวมถึงตัวแปรการตั้งค่าเช่น $ canCreate, $ canEdit และ $ canCheckin เมื่อคุณคุ้นเคยกับ ACL จริงๆแล้วคุณสามารถตั้งค่ากฎ ACL ของคุณเองเช่น $ canView ข้อเสนอแนะทั้งหมด - การเขียนโปรแกรมคุณสามารถทำได้หลายพันวิธี
GDP

ฮ่า ๆ! โอเคโอเค. เข้าใจขอบคุณ มากเกินไปที่จะเรียนรู้ ...
Isidro Baquero

4

อาจเป็นคำตอบที่ล่าช้าสำหรับคำถามนี้ แต่นี่คือสิ่งที่ฉันใช้:

ในไฟล์ controller.php หลักฉันแทนที่ฟังก์ชั่นการแสดงผลดังนี้:

public function display($cachable = false, $urlparams = array())
{
        $user = JFactory::getUser();
        $app  = JFactory::getApplication();

        $view = $this->input->get('view');

        if ($view == 'someview' || $view == 'anotherview')
        {
            if ($user->get('guest') == 1)
            {
                $uri = JUri::getInstance();
                $this->setRedirect(
                        JRoute::_('index.php?option=com_users&view=login&return=' . base64_encode($uri->toString())), $app->enqueueMessage(JText::_('COM_YOURCOMPONENT_LOGIN_REQUIRED'), 'warning')
                );

                return;
            }
         }

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