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.