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

11

Dans mon composant personnalisé, j'aimerais pouvoir restreindre des vues spécifiques à certains groupes d'utilisateurs uniquement. 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 va sur une page sans Itemid assignée ... dans ce cas, c'est le composant lui-même qui a besoin pour vérifier le groupe d'utilisateurs et déterminer s'il est capable d'afficher cette page ... comment puis-je restreindre cela dans mon code? Juste une simple vérification codée en dur pour le groupe d'utilisateurs de l'utilisateur? Ou existe-t-il une manière "standard" de procéder?

J'ai vérifié la documentation et j'ai trouvé ceci:

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

mais c'est pour ce que l'utilisateur peut faire, pas pour ce que l'utilisateur peut voir. J'ai également 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 dois-je procéder pour cela? Dois-je définir des actifs pour l'objet principal généré par ma vue afin de pouvoir tester son accès avec JUser?

Merci d'avance.

Isidro Baquero
la source

Réponses:

9

Vous pouvez créer un plugin système pour gérer toutes les requêtes vers 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
}
pseudo
la source
Hmmm ... approche intéressante. Cela semble plus propre et vous mettriez toute la logique dans un endroit spécifique. Je suppose que ce sera un peu "pire" en termes de performances que de le faire directement dans le composant, mais probablement juste quelques millisecondes supplémentaires non pertinentes, non?
Isidro Baquero
bien comparativement, vous pouvez dire que ... encore cette performance de millisecondes n'a pas beaucoup d'impact sur les performances globales du composant et après tous ces déclencheurs sont destinés à être utilisés :) et quel est le point d'ajouter du code supplémentaire dans le composant lui-même et de créer confusion
Nick
4

Voici le code dont vous avez besoin pour commencer à vous montrer comment voir dans quels groupes un utilisateur se trouve.

$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/>';
}
PIB
la source
Merci PIB. Cette partie était plus ou moins sous contrôle. Je comprends donc que la "bonne façon" de le faire est d'utiliser cela sur chaque vue?
Isidro Baquero,
Vous devriez, sauf si vous souhaitez restreindre toutes les vues, auquel cas vous devez configurer certains paramètres de composant ou une fonction d'assistance utilisée pour chaque vue.
PIB du
Intéressant ... où puis-je continuer mes recherches sur la restriction des vues via les paramètres des composants? Merci encore!
Isidro Baquero
Il semble que vous souhaitiez probablement en savoir plus sur l'ACL Joomla, mais je ne peux que suggérer Google pour la recherche, ou essayer un composant sur component-creator.com et voir comment tout cela fonctionne. Leur code généré comprend la définition de variables comme $ canCreate, $ canEdit et $ canCheckin. Une fois que vous êtes VRAIMENT familier avec ACL, vous pouvez définir votre propre règle ACL comme $ canView. Ce ne sont que des suggestions - c'est de la programmation, vous pouvez le faire de mille manières différentes.
PIB du
LOL! OK OK. Compris, merci. Trop à apprendre ...
Isidro Baquero
4

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