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.