Bagaimana cara membatasi akses ke tampilan komponen khusus?

11

Dalam komponen khusus saya, saya ingin dapat membatasi tampilan tertentu hanya pada grup pengguna tertentu. Jika saya membuat item menu untuk salah satu tampilan saya, itu cukup mudah dilakukan: Saya hanya memilih tingkat akses untuk item menu itu dan saya selesai.

Sekarang, masalahnya muncul jika seseorang mencoba mengakses langsung URL dengan opsi = com_mycomponent, atau pengalihan internal komponen saya pergi ke halaman tanpa Itemid yang ditugaskan ... dalam hal ini, itu adalah komponen itu sendiri yang perlu untuk memeriksa grup pengguna dan menentukan apakah ia dapat melihat halaman itu ... bagaimana saya bisa membatasi itu dalam kode saya? Hanya pemeriksaan hardcoded sederhana untuk grup pengguna pengguna? Atau ada cara "standar" untuk melakukannya?

Saya telah memeriksa dokumentasi, dan telah menemukan ini:

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

tapi itu untuk apa yang bisa dilakukan pengguna, bukan untuk apa yang bisa dilihat pengguna. Saya juga menemukan utas forum ini:

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

kode di awal sudah cukup tua, tetapi pada akhirnya disarankan untuk menggunakan ini:

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

Bagaimana saya harus melanjutkan untuk itu? Haruskah saya mendefinisikan aset untuk objek utama yang dihasilkan oleh tampilan saya sehingga saya dapat menguji akses untuk itu dengan JUser?

Terima kasih sebelumnya.

Isidro Baquero
sumber

Jawaban:

9

Anda dapat membuat plugin sistem untuk menangani semua permintaan ke komponen khusus Anda sebelum mengirim kontrol ke komponen.

Gunakan acara onAfterRoute untuk melakukan semua pemeriksaan akses.

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
}
Nick
sumber
Hmmm ... pendekatan yang menarik. Kedengarannya lebih bersih, dan Anda akan menempatkan semua logika di tempat tertentu. Saya kira ini akan sedikit "lebih buruk" dalam hal kinerja daripada melakukannya secara langsung dalam komponen, tetapi mungkin hanya milidetik tambahan yang tidak relevan, kan?
Isidro Baquero
baik secara komparatif Anda dapat mengatakan bahwa ... masih hit performa milidetik ini tidak membuat banyak dampak pada kinerja keseluruhan komponen dan setelah semua pemicu ini dimaksudkan untuk digunakan :) dan apa gunanya menambahkan kode tambahan dalam komponen itu sendiri dan membuat kebingungan
Nick
4

Berikut kode yang harus Anda mulai dengan menunjukkan kepada Anda cara melihat grup apa yang digunakan pengguna.

$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/>';
}
PDB
sumber
Terima kasih GDP. Bagian ini kurang lebih terkendali. Jadi saya mengerti "cara yang benar" untuk melakukannya adalah menggunakannya pada setiap tampilan?
Isidro Baquero
Anda harus, kecuali Anda ingin membatasi semua tampilan, dalam hal ini Anda akan mengatur beberapa parameter komponen, atau fungsi pembantu yang digunakan untuk setiap fiew.
GDP
Menarik ... di mana saya bisa terus meneliti tentang membatasi tampilan melalui parameter komponen? Terima kasih lagi!
Isidro Baquero
Kedengarannya seperti Anda mungkin ingin belajar tentang ACL Joomla juga, tapi saya hanya bisa menyarankan Google untuk penelitian, atau coba komponen lain di component-creator.com dan lihat bagaimana semuanya bekerja. Kode yang dihasilkan termasuk variabel pengaturan seperti $ canCreate, $ canEdit dan $ canCheckin. Setelah Anda BENAR-BENAR akrab dengan ACL, Anda dapat mengatur aturan ACL Anda sendiri seperti $ canView. Semua hanya saran - ini pemrograman, Anda dapat melakukannya dengan ribuan cara berbeda.
GDP
LOL! Baiklah baiklah Dipahami, terima kasih. Terlalu banyak untuk dipelajari ...
Isidro Baquero
4

Mungkin jawaban terlambat untuk pertanyaan ini. Tapi inilah yang saya gunakan:

Dalam file controller.php utama saya mengesampingkan fungsi tampilan sebagai berikut:

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);
 }
Sahil Purav
sumber