web-dev-qa-db-fra.com

Comment restreindre l'accès aux vues de composants personnalisés?

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.

11
Isidro Baquero

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
}
9
Nick

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

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);
 }
4
Sahil Purav