Jak ograniczyć dostęp do niestandardowych widoków komponentów?


11

W moim niestandardowym komponencie chciałbym mieć możliwość ograniczenia określonych widoków tylko do niektórych grup użytkowników. Jeśli utworzę element menu dla jednego z moich widoków, jest to dość łatwe: po prostu wybieram poziom dostępu do tego elementu menu i gotowe.

Problem pojawia się wtedy, gdy ktoś próbuje uzyskać bezpośredni dostęp do adresu URL za pomocą opcji = com_mycomponent, lub dowolne z wewnętrznych przekierowań mojego komponentu przechodzi na stronę bez przypisanego Itemid ... w takim przypadku sam komponent potrzebuje tego aby sprawdzić grupę użytkowników i ustalić, czy jest w stanie wyświetlić tę stronę ... jak mogę to ograniczyć w moim kodzie? Prosty, zakodowany czek dla grupy użytkowników? Czy istnieje „standardowy” sposób na zrobienie tego?

Sprawdziłem dokumentację i znalazłem to:

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

ale to jest to, co użytkownik może zrobić, a nie to, co użytkownik może zobaczyć. Znalazłem również ten wątek na forum:

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

kod na początku jest dość stary, ale na końcu zaleca się użycie tego:

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

Jak mam to zrobić? Czy powinienem zdefiniować zasoby dla głównego obiektu wygenerowanego przez mój widok, aby móc przetestować dostęp do niego za pomocą JUser?

Z góry dziękuję.

Odpowiedzi:


9

Możesz utworzyć wtyczkę systemową do obsługi wszystkich żądań do niestandardowego komponentu przed wysłaniem kontroli do tego komponentu.

Użyj zdarzenia onAfterRoute , aby wykonać wszystkie sprawdzanie dostępu.

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 ... ciekawe podejście. Brzmi czysto, a logikę umieściłbyś w określonym miejscu. Myślę, że będzie to nieco „gorsze” pod względem wydajności niż robienie tego bezpośrednio w komponencie, ale prawdopodobnie tylko nieistotne dodatkowe milisekundy, prawda?
Isidro Baquero

porównawczo można powiedzieć, że ... wciąż to milisekundowe uderzenie w wydajność nie ma większego wpływu na ogólną wydajność komponentu, a przecież wszystkie te wyzwalacze mają być użyte :) i po co dodawać dodatkowy kod do samego komponentu i tworzyć zamieszanie
Nick

4

Oto kod, który musisz zacząć od pokazania, w jakich grupach znajduje się użytkownik.

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

Dzięki PKB. Ta część była mniej więcej pod kontrolą. Rozumiem więc, że „właściwym sposobem” jest użycie tego w każdym widoku?
Isidro Baquero

Będziesz musiał, chyba że chcesz ograniczyć wszystkie widoki, w którym to przypadku skonfigurowałbyś niektóre parametry komponentu lub funkcję pomocniczą, która jest używana dla każdego podglądu.
PKB,

Ciekawe ... gdzie mogę przejść, aby kontynuować badania dotyczące ograniczania widoków za pomocą parametrów komponentu? Dzięki jeszcze raz!
Isidro Baquero

Wygląda na to, że prawdopodobnie chcesz również dowiedzieć się o ACL Joomla, ale mogę tylko zasugerować Google do badań lub wypróbować komponent na component-creator.com i zobaczyć, jak to wszystko działa. Ich wygenerowany kod obejmuje ustawianie zmiennych takich jak $ canCreate, $ canEdit i $ canCheckin. Gdy NAPRAWDĘ zapoznasz się z ACL, możesz ustawić własną regułę ACL, np. $ CanView. Wszystkie tylko sugestie - to programowanie, możesz to zrobić na tysiąc różnych sposobów.
PKB,

LOL! Ok ok. Zrozumiałem, dzięki. Za dużo do nauczenia ...
Isidro Baquero,

4

Prawdopodobnie późna odpowiedź na to pytanie. Ale oto, czego użyłem:

W głównym pliku controller.php zastąpiłem funkcję wyświetlania w następujący sposób:

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);
 }
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.