Nel mio componente personalizzato, vorrei essere in grado di limitare viste specifiche solo a determinati gruppi utenti. Se creo una voce di menu per una delle mie viste, è 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 quel 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.
È 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 tutti i controlli di 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
}
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/>';
}
Probabilmente la risposta tardiva a questa domanda. Ma ecco cosa 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);
}