web-dev-qa-db-fra.com

Restreindre l'accès des composants frontaux

Je développe un composant Joomla et j'aimerais que les administrateurs aient la possibilité de restreindre l'accès à une vue particulière dans l'interface frontale.

Si vous créez un élément de menu pour cette vue, puis essayez d'y accéder via le menu, la page de connexion de l'utilisateur apparaît. Tout bon.

Cependant, je peux toujours accéder directement à cette vue en tapant l’URL complète (index.php?option=com_mycomponent&view=myRestrictedView)

Je me rends compte que je dois mettre du code dans le contrôleur pour vérifier l'objet utilisateur actuel par rapport aux autorisations restantes, mais je ne sais pas par où commencer. J'ai consulté le didacticiel Développement d'un composant MVC, mais celui-ci se concentre sur le back-end.

TLDR - De quel code d'autorisation ai-je besoin dans mon controller.php pour vérifier si l'utilisateur est autorisé pour cette vue et où puis-je 'définir' ce niveau d'autorisation (config.xml type de champ accesslevel?)

Je pense que le moyen le plus simple est un champ accesslevel dans mon config.xml et un appel à JUser::getAuthorisedViewLevels mais ça semble un peu hacky ...

5
codinghands

Le premier point de départ est Joomla. Si Joomla le fait, vous pouvez lire le code pour voir comment il a été mis en œuvre. Le modèle ACL actuel a été introduit au tout début de la ligne 2.5 (alias 1.6)

Joomla décompose sa fonctionnalité ACL en "visualisation" et en "action". Ce que vous demandez, c'est de visualiser .

Dans com_content, Vous pouvez voir que la vue Article vérifie l'accès à la vue dans le fichier de classe de vue ContentViewArticle avec les critères suivants:

    // Check the view access to the article (the model has already computed the values).
    if ($item->params->get('access-view') == false && ($item->params->get('show_noauth', '0') == '0'))
    {
        JError::raiseWarning(403, JText::_('JERROR_ALERTNOAUTHOR'));
        return;
    }

Vous remarquerez le commentaire suivant: " le modèle a déjà calculé les valeurs ", dans ce cas, le modèle est ContentModelArticle trouvé dans /components/com_content/models/article.php. Vers la fin de la méthode getItem(), vous trouverez:

// Compute view access permissions.
if ($access = $this->getState('filter.access'))
{
    // If the access filter has been set, we already know this user can view.
    $data->params->set('access-view', true);
}
else
{
    // If no access filter is set, the layout takes some responsibility for display of limited information.
    $user = JFactory::getUser();
    $groups = $user->getAuthorisedViewLevels();

    if ($data->catid == 0 || $data->category_access === null)
    {
        $data->params->set('access-view', in_array($data->access, $groups));
    }
    else
    {
        $data->params->set('access-view', in_array($data->access, $groups) && in_array($data->category_access, $groups));
    }
}

Bien entendu, en fonction de votre extension, il se peut que vous ayez à vérifier, en plus de la liste de contrôle d'accès de Joomla, d'autres exigences. Il y a aussi l'attente très raisonnable que vous voulez contrôler ce que les utilisateurs font " faire ".

Pour avoir une meilleure idée de la liste de contrôle d'accès, la lecture recommandée est probablement "Liste de contrôle d'accès" et "J25: Didacticiel sur la liste de contrôle d'accès" sur site Web de Joomla Doc .

7
Craig

La réponse de @Craig est très bonne, mais JERROR sera obsolète dans Joomla 4.0. Vous pouvez utiliser le code ci-dessous à la place, lorsque vous souhaitez notifier l'interface utilisateur.

\Joomla\CMS\Factory::getApplication()->enqueueMessage($msg, 'warning')

2
Paulo Griiettner

Je voudrais utiliser http://component-creator.com/ , la liste de contrôle d'accès pour les vues frontales est intégrée à tous les composants générés.

0
Andrés Maeso