web-dev-qa-db-fra.com

Comment définir les autorisations Joomla par programme?

Préface

Permettez-moi de commencer par cet article en disant que, même si j'ai une expérience considérable de PHP, je ne connais pas Joomla de manière significative. Ce qui suit est basé sur des hypothèses sur le fonctionnement de Joomla et sur les informations que j'ai recueillies auprès de personnes plus familières avec ce CMS que moi. Je vous serais reconnaissant de corriger toute idée fausse que j'ai.

Le problème

Fondamentalement, cette question se résume à: Est-il possible pour les extensions d'un composant Joomla de définir leurs propres autorisations?

Définition des autorisations pour un composant (cette partie fonctionne)

Je développe sur CiviCRM, un gestionnaire de relations constitutif pour les organisations à but non lucratif, qui s'intègre à Joomla, Drupal, WordPress et Backdrop. CiviCRM est pour la plupart une application autonome; il s'intègre aux différents CMS en se transformant en module, composant, etc., mais sa logique centrale est indépendante de CMS.

Dans le cas de Joomla, CiviCRM définit ses autorisations principales dans le fichier access.xml Du composant. Ces autorisations de base fonctionnent comme prévu. L'interface utilisateur des autorisations de Joomla les rend, et ils peuvent être cochés et désactivés comme toute autre autorisation Joomla.

Ajouter par programme de nouvelles définitions d'autorisations à un composant (c'est là que j'ai besoin d'aide)

Voici où les choses deviennent difficiles. Comme Joomla, CiviCRM a un système d’extension et les extensions de CiviCRM peuvent elles-mêmes définir de nouvelles autorisations.

Les développeurs d’extensions CiviCRM enregistrent les nouvelles autorisations à l’aide d’une fonction de raccordement hook_civicrm_permission . Le noyau CiviCRM résume les différences entre les CMS et enregistre les autorisations définies par l'extension avec le CMS hôte (par exemple, via sa mise en œuvre de la fonction de hook de Drupal hook_permission ). Dans tous les CMS autres que Joomla, cela a été réglé de manière à ce que l'enregistrement d'une nouvelle autorisation soit suffisant pour l'afficher aux côtés d'autres autorisations dans les interfaces utilisateur appropriées, le magasin de CMS où les groupes/rôles ont reçu l'autorisation et le CMS. l'appliquer.

Si j'ai bien compris, l'interface utilisateur de gestion des autorisations de Joomla est construite en consommant tous les fichiers access.xml De tous les composants Joomla au moment de l'exécution. Comme les autorisations définies par l'extension de CiviCRM n'existent dans aucun fichier access.xml, Ces autorisations ne sont pas restituées sous la forme.

Existe-t-il d'autres extensions extensibles dans l'espace Joomla? Comment traitent-ils ce scénario? La solution idéale ne nécessiterait pas que les développeurs d’extensions CiviCRM conditionnent leurs extensions CiviCRM différemment - vous en aurez assez pour en apprendre davantage sur CiviCRM sans entrer dans les détails de chaque CMS! S'il existe un moyen de modifier le noyau de CiviCRM (ou peut-être de modifier Joomla) afin que des extensions CiviCRM arbitraires puissent transmettre des définitions d'autorisation arbitraires à Joomla via le noyau de CiviCRM, une telle solution serait préférable.

Choses qui ont été essayées

  • Le piratage de access.xml De CiviCRM pour inclure les autorisations définies par les extensions semble fonctionner, mais il s'agit clairement d'un cauchemar de maintenance et d'une expérience utilisateur déplorable.
  • Nos tests montrent que les autorisations sont réellement appliquées si vous parvenez à les définir. Dans une instance de test, nous l'avons fait en piratant la base de données pour définir les autorisations souhaitées. Encore une fois, pas une grande expérience utilisateur.
  • J'ai également envisagé de prétendre que l'interface utilisateur des autorisations Joomla n'existe pas et de créer une interface utilisateur distincte pour les autorisations uniquement pour CiviCRM sur Joomla, mais je devrais tout de même en savoir plus sur les API d'autorisation de Joomla, et je préférerais ne pas fragmenter l'expérience utilisateur de cette façon. .
4
universalhandle

Je voulais faire une mise à jour depuis un certain temps. J'ai résolu ce problème avec deux pull demandes à CiviCRM il y a quelques mois. Ma mémoire s'estompe et il se peut que certaines modifications incorrectes de la terminologie Joomla soient les bienvenues.

La première demande d'extraction modifie le composant (c'est-à-dire les parties Joomla). Fondamentalement, au lieu d’utiliser le type de champ de formulaire rules, j’ai créé un nouveau type civiperms, qui est une extension du premier. J'ai redéfini la méthode getInput() de cette classe afin de pouvoir put a wrapper autour de JAccess::getActions(), qui est responsable de l'obtention des autorisations de access.xml. Le reste de la méthode est inchangé. Mon wrapper demande à CiviCRM toutes les autorisations ajoutées dynamiquement et les ajoute à celles que Joomla a trouvées par lui-même.

La deuxième demande d'extraction concerne davantage CiviCRM-isms et n'intéressera probablement personne pour tenter de résoudre ce problème sur une plate-forme différente.

2
universalhandle

Je me rends compte que c'est un peu tard mais…

Oui, il est possible que les extensions définissent leurs propres autorisations, car en réalité, les "autorisations" ne sont fondamentalement que des chaînes. Cependant, la méthode standard consisterait à utiliser le fichier access.xml de l'extension décrit ci-dessus. Les étapes seraient les suivantes:

  1. Définissez votre autorisation dans le fichier access.xml (vous aurez généralement associé des chaînes de texte traduisibles pour la description de l'autorisation, etc.).

  2. Utilisez le type de champ "règles" standard de Joomla dans un formulaire pour permettre aux administrateurs de saisir les autorisations sur les utilisateurs. Un peu de travail supplémentaire est nécessaire pour stocker ces autorisations dans la base de données - elles sont stockées dans la table Joomla Assets. Par exemple, votre extension aurait un enregistrement d'actif et les autorisations seraient stockées au format JSON dans le champ des règles de cet enregistrement.

  3. Si vous souhaitez restreindre l’accès, vous devez ensuite vérifier si un utilisateur individuel dispose de votre permission, par exemple via:

JFactory::getUser()->authorise("your.permission", "com_yourcomponent"); retournera true ou false, selon que l'utilisateur possède ou non l'autorisation.

JHelperContent::getActions("com_yourcomponent"); renverra un tableau associatif contenant toutes les autorisations associées à votre extension, et indiquant si l'utilisateur connecté en possède ou non.

Votre description des capacités de Joomla est correcte, à ma connaissance. Une possibilité que vous pourriez envisager consiste à stocker la définition de vos autorisations localement dans votre propre composant, puis à générer par programme le fichier access.xml chaque fois que vous définissez une nouvelle autorisation. Cependant, je ne peux pas dire quel impact cela aurait sur l'expérience utilisateur.

Comme vous le dites, vous pouvez ignorer l'interface utilisateur de Joomla et stocker les autorisations directement dans l'enregistrement des actifs. Cependant, vous devez être conscient de l'héritage des autorisations des utilisateurs et des groupes d'utilisateurs implémenté par Joomla. Je pense donc que cette approche pourrait être plus problématique.

Je vous suggère de consulter certaines informations du didacticiel sur le Web concernant les autorisations Joomla car ce domaine est assez complexe: cette vidéo (qui mentionne une extension facilitant la configuration du contrôle d'accès, mais je souhaite n’en avons aucune expérience) et cette étape du tutoriel de développement de Joomla MVC .

Bonne chance!

2
Robbie Jackson