Come limitare l'accesso alle viste dei componenti personalizzate?


11

Nel mio componente personalizzato, vorrei essere in grado di limitare le viste specifiche solo a determinati gruppi utenti. Se creo una voce di menu per una delle mie visualizzazioni, è abbastanza facile da fare: seleziono semplicemente il livello di accesso per quella voce di menu e il gioco è fatto.

Ora, il problema si presenta se qualcuno tenta di accedere direttamente a un URL con option = com_mycomponent o uno qualsiasi dei reindirizzamenti interni del mio componente va a una pagina senza Itemid assegnato ... in tal caso, è il componente stesso quello che deve per controllare il gruppo di utenti e determinare se è in grado di visualizzare quella pagina ... come posso limitarlo nel mio codice? Solo un semplice controllo hardcoded per il gruppo utenti dell'utente? O c'è un modo "standard" per farlo?

Ho controllato la documentazione e ho trovato questo:

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

ma questo è per ciò che l'utente può fare, non per ciò che l'utente può vedere. Ho anche trovato questa discussione nel forum:

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

il codice all'inizio è piuttosto vecchio, ma alla fine si consiglia di utilizzare questo:

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

Come devo procedere? Devo definire le risorse per l'oggetto principale generato dalla mia vista in modo da poter testare l'accesso per esso con JUser?

Grazie in anticipo.

Risposte:


9

È possibile creare un plug-in di sistema per gestire tutte le richieste al componente personalizzato prima di inviare il controllo al componente.

Utilizzare l' evento onAfterRoute per eseguire tutto il controllo dell'accesso.

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 ... approccio interessante. Sembra più pulito e metti tutta la logica in un posto specifico. Immagino che questo sarà un po '"peggio" in termini di prestazioni rispetto a farlo direttamente nel componente, ma probabilmente solo un irrilevante millisecondo in più, giusto?
— Isidro Baquero,

beh, relativamente, si può dire che ... ancora questo millisecondo hit di performance non crea molto impatto sulle prestazioni complessive del componente e dopo che tutti questi trigger sono pensati per essere utilizzati :) e qual è il punto di aggiungere ulteriore codice nel componente stesso e creare confusione
— Nick,

4

Ecco il codice necessario per iniziare mostrando come vedere in quali gruppi si trova un utente.

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

Grazie PIL. Questa parte era più o meno sotto controllo. Quindi capisco che il "modo giusto" per farlo è usarlo su ogni vista?
— Isidro Baquero,

Dovresti, a meno che tu non voglia limitare tutte le viste, nel qual caso avresti impostato alcuni parametri dei componenti, o una funzione di supporto che viene utilizzata per ogni vista.
— PIL,

Interessante ... dove posso andare per continuare a cercare di limitare le visualizzazioni tramite i parametri dei componenti? Grazie ancora!
— Isidro Baquero,

Sembra che tu voglia probabilmente conoscere anche l'ACL di Joomla, ma posso solo suggerire Google per la ricerca o provare un componente su component-creator.com e vedere come funziona. Il loro codice generato include l'impostazione di variabili come $ canCreate, $ canEdit e $ canCheckin. Una volta familiarità con ACL, puoi impostare la tua regola ACL come $ canView. Tutti solo suggerimenti: è programmazione, puoi farlo in mille modi diversi.
— PIL,

LOL! Ok ok. Capito, grazie. Troppo da imparare ...
— Isidro Baquero,

4

Probabilmente la risposta tardiva a questa domanda. Ma ecco quello che ho usato:

Nel file controller.php principale ho ignorato la funzione di visualizzazione come segue:

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);
 }
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.