Özel bileşen görünümlerine erişim nasıl kısıtlanır?


11

Özel bileşenimde, belirli görünümleri yalnızca belirli kullanıcı gruplarıyla kısıtlamak istiyorum. Görünümlerimden biri için bir menü öğesi oluşturursam, bunu yapmak oldukça kolay: Yalnızca bu menü öğesi için erişim düzeyini seçiyorum ve işim bitti.

Şimdi, birisi seçenek = com_mycomponent ile doğrudan bir URL'ye erişmeye çalışırsa veya bileşenimin dahili yönlendirmelerinden herhangi biri atanmış Itemid olmayan bir sayfaya giderse gelir ... bu durumda, bileşenin kendisi gereken kullanıcı grubunu kontrol etmek ve bu sayfayı görüntüleyip görüntüleyemeyeceğini belirlemek için ... bunu kodumda nasıl kısıtlayabilirim? Kullanıcının kullanıcı grubu için basit bir kodlanmış denetim mi? Yoksa bunu yapmanın "standart" bir yolu var mı?

Belgeleri kontrol ediyorum ve buldum:

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

ancak bu kullanıcının görebildiği, kullanıcının görebileceği şey değil. Ayrıca bu forum iş parçacığı buldum:

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

başlangıçtaki kod oldukça eskidir, ancak sonunda bunu kullanmanız önerilir:

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

Bunun için nasıl ilerlemeliyim? JUser ile erişimi test edebilmek için, görünümüm tarafından oluşturulan ana nesne için varlıkları tanımlamalı mıyım?

Şimdiden teşekkürler.

Yanıtlar:


9

Bileşene denetim göndermeden önce özel bileşeninize gelen tüm istekleri işlemek için bir sistem eklentisi oluşturabilirsiniz.

Tüm erişim denetimlerini gerçekleştirmek için onAfterRoute olayını kullanın .

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
}

Hmmm ... ilginç bir yaklaşım. Daha temiz görünüyor ve tüm mantığı belirli bir yere koyacaksınız. Sanırım bu performans açısından bunu doğrudan bileşen içinde yapmaktan biraz daha kötü olacak, ama muhtemelen sadece alakasız ekstra milisaniye, değil mi?
Isidro Baquero

iyi bir şekilde şunu söyleyebilirsiniz ... yine de bu milisaniyelik performans isabeti, bileşenin genel performansı üzerinde çok fazla etki yaratmaz ve sonuçta bu tetikleyiciler kullanılmalıdır :) ve bileşenin kendisine ek kod ekleme ve oluşturma karışıklık
Nick

4

Kullanıcının hangi gruplarda olduğunu nasıl görebileceğinizi göstermek için kullanmaya başlamanız gereken kod.

$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/>';
}

Teşekkürler GSYİH. Bu kısım aşağı yukarı kontrol altındaydı. Yani bunu yapmak için "doğru yolu" her görünümünde kullanıyor anlamak?
Isidro Baquero

Tüm görünümleri kısıtlamak istemiyorsanız, bu durumda bazı bileşen parametrelerini veya her görüşme için kullanılan bir yardımcı işlevi ayarlamış olmanız gerekir.
GSYİH

İlginç ... Bileşen parametreleri aracılığıyla görünümleri kısıtlama hakkında araştırma yapmaya devam etmek için nereye gidebilirim? Tekrar teşekkürler!
Isidro Baquero

Muhtemelen Joomla ACL hakkında bilgi edinmek istiyorsunuz gibi görünüyor, ancak Google'a yalnızca araştırma için önerebilir veya component-creator.com'da bir bileşeni deneyebilir ve bunların nasıl çalıştığını görebilirsiniz. Oluşturdukları kod $ canCreate, $ canEdit ve $ canCheckin gibi değişkenleri içerir. ACL'yi gerçekten öğrendikten sonra, $ canView gibi kendi ACL kuralınızı ayarlayabilirsiniz. Hepsi sadece öneriler - programlama, bin farklı yolla yapabilirsiniz.
GSYİH

LOL! Tamam, tamam. Anladım teşekkürler. Öğrenmek için çok fazla ...
Isidro Baquero

4

Muhtemelen bu sorunun geç cevabı. Ama burada kullandığım şey:

Ana controller.php dosyasında aşağıdaki gibi görüntüleme işlevini geçersiz kıldım:

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);
 }
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.