Dans mon composant personnalisé, j'aimerais pouvoir limiter certaines vues à certains groupes d'utilisateurs. Si je crée un élément de menu pour l'une de mes vues, c'est assez facile à faire: je sélectionne simplement le niveau d'accès pour cet élément de menu et j'ai terminé.
Maintenant, le problème survient si quelqu'un essaie d'accéder directement à une URL avec option = com_mycomponent, ou si l'une des redirections internes de mon composant passe à une page sans Itemid affecté ... Dans ce cas, c'est le composant lui-même qui a besoin vérifier le groupe d'utilisateurs et déterminer s'il est capable d'afficher cette page ... comment puis-je limiter cela dans mon code? Juste une simple vérification codée en dur pour le groupe d'utilisateurs de l'utilisateur? Ou il y a un moyen "standard" de le faire?
J'ai vérifié la documentation et j'ai trouvé ceci:
http://docs.joomla.org/J2.5:How_to_implement_actions_in_votre_code
mais c'est pour ce que l'utilisateur peut faire, pas pour ce que l'utilisateur peut voir. J'ai aussi trouvé ce fil de discussion:
http://forum.joomla.org/viewtopic.php?t=530721
le code au début est assez ancien, mais à la fin, il est recommandé d'utiliser ceci:
http://api.joomla.org/cms-3/classes/JUser.html#method_authorise
Comment devrais-je procéder pour cela? Devrais-je définir des actifs pour l'objet principal générés par ma vue afin de pouvoir tester l'accès à cet objet avec JUser?
Merci d'avance.
Vous pouvez créer un plug-in système pour gérer toutes les demandes adressées à votre composant personnalisé avant d'envoyer le contrôle au composant.
Utilisez l'événement onAfterRoute pour effectuer toutes les vérifications d'accès.
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
}
Voici le code dont vous avez besoin pour commencer à vous montrer comment voir les groupes dans lesquels se trouve un utilisateur.
$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/>';
}
Probablement la réponse tardive à cette question. Mais voici ce que j'ai utilisé:
Dans le fichier controller.php principal, j'ai remplacé la fonction d'affichage comme suit:
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);
}