it-swarm.com.de

Wie definiere ich Joomla-Berechtigungen programmatisch?

Vorwort

Lassen Sie mich diesen Beitrag vorwegnehmen, indem ich sage, dass ich mit Joomla in keiner bedeutenden Weise vertraut bin, obwohl ich über beträchtliche Erfahrung mit PHP verfüge. Das Folgende basiert auf Annahmen darüber, wie Joomla funktioniert, und Informationen, die ich von Leuten erhalten habe, die mit diesem CMS besser vertraut sind als ich. Ich wäre Ihnen dankbar, wenn Sie meine Missverständnisse korrigieren würden.

Das Problem

Grundsätzlich läuft diese Frage auf Folgendes hinaus: Können Erweiterungen einer Joomla-Komponente ihre eigenen Berechtigungen definieren?

Festlegen von Berechtigungen für eine Komponente (dieser Teil funktioniert)

Ich entwickle CiviCRM, einen Beziehungsmanager für gemeinnützige Organisationen, der in Joomla, Drupal, WordPress und Backdrop integriert ist. CiviCRM ist größtenteils eine eigenständige Anwendung. Es lässt sich in die verschiedenen CMS integrieren, indem es sich selbst als Modul, Komponente usw. verpackt. Seine Kernlogik ist jedoch CMS-unabhängig.

Im Fall von Joomla definiert CiviCRM seine Kernberechtigungen in der Datei access.xml Der Komponente. Diese Kernberechtigungen funktionieren wie erwartet. Joomlas Berechtigungs-UI rendert sie und sie können wie jede andere Joomla-Berechtigung aktiviert und deaktiviert werden.

Programmgesteuertes Hinzufügen neuer Berechtigungsdefinitionen zu einer Komponente (hier benötige ich Hilfe)

Hier wird es schwierig. Wie Joomla verfügt CiviCRM über ein Erweiterungssystem, und Erweiterungen von CiviCRM können selbst neue Berechtigungen definieren.

Entwickler von CiviCRM-Erweiterungen registrieren neue Berechtigungen mithilfe einer Hook-Funktion hook_civicrm_permission . Der CiviCRM-Kern abstrahiert die Unterschiede zwischen den CMS und registriert durch Erweiterungen definierte Berechtigungen beim Host-CMS (z. B. über die Implementierung der Hook-Funktion von Drupal hook_permission ). In jedem CMS außer Joomla wurde dies so ausgearbeitet, dass es ausreicht, nur eine neue Berechtigung zu registrieren, um sie zusammen mit anderen Berechtigungen in den entsprechenden Benutzeroberflächen anzuzeigen, im CMS zu speichern, welchen Gruppen/Rollen die Berechtigung erteilt wurde, und im CMS erzwinge es.

Soweit ich weiß, wird die Benutzeroberfläche für die Berechtigungsverwaltung von Joomla erstellt, indem alle access.xml - Dateien für alle Joomla-Komponenten zur Laufzeit verwendet werden. Da die durch die Erweiterung definierten Berechtigungen von CiviCRM in keiner access.xml - Datei vorhanden sind, werden diese Berechtigungen nicht im Formular gerendert.

Gibt es andere erweiterbare Erweiterungen im Joomla-Bereich? Wie gehen sie mit diesem Szenario um? Die ideale Lösung würde nicht erfordern, dass CiviCRM-Erweiterungsentwickler ihre CiviCRM-Erweiterungen unterschiedlich verpacken - es gibt genug, um sich mit CiviCRM vertraut zu machen, ohne auf die Details der einzelnen CMS einzugehen! Wenn es eine Möglichkeit gibt, den CiviCRM-Kern zu ändern (oder möglicherweise eine Änderung an Joomla vorzunehmen), sodass beliebige CiviCRM-Erweiterungen beliebige Berechtigungsdefinitionen über CiviCRM-Kern an Joomla übergeben können, ist eine solche Lösung vorzuziehen.

Dinge, die ausprobiert wurden

  • Das Hacken von CiviCRMs access.xml, Um durch Erweiterungen definierte Berechtigungen einzuschließen, scheint zu funktionieren, aber dies ist eindeutig ein Wartungs-Albtraum und eine schreckliche Benutzererfahrung.
  • Unsere Tests zeigen, dass die Berechtigungen tatsächlich erzwungen werden, wenn Sie sie festlegen können. In einer Testinstanz haben wir die Datenbank gehackt, um die gewünschten Berechtigungen festzulegen. Auch hier keine großartige Benutzererfahrung.
  • Ich habe auch darüber nachgedacht, so zu tun, als ob die Joomla-Benutzeroberfläche für Berechtigungen nicht vorhanden wäre, und eine separate Benutzeroberfläche nur für CiviCRM in Joomla erstellt, aber ich müsste noch etwas über die Joomla-Berechtigungs-APIs lernen, und ich würde es vorziehen, die Benutzererfahrung nicht auf diese Weise zu fragmentieren .
4
universalhandle

Ich wollte schon seit einiger Zeit ein Update bereitstellen. Ich habe dieses Problem mit zwei pull Anfragen to CiviCRM vor ein paar Monaten gelöst. Mein Gedächtnis verblasst, und ich könnte einige der Joomla-Begriffe als falsch bezeichnen - Änderungen sind willkommen.

Die erste Pull-Anforderung nimmt Änderungen an der Komponente (d. H. Den Joomla-Teilen) vor. Grundsätzlich habe ich anstelle des Formularfeldtyps rules einen neuen Typ civiperms erstellt, der eine Erweiterung des vorherigen ist. Ich habe die getInput() -Methode dieser Klasse überschrieben, damit ich put a wrapper um JAccess::getActions() herum schreiben kann, das dafür verantwortlich ist, die Berechtigungen von access.xml. Der Rest der Methode bleibt unverändert. Mein Wrapper fragt CiviCRM nach dynamisch hinzugefügten Berechtigungen ab und hängt diese an die von Joomla selbst gefundenen an.

Die zweite Pull-Anforderung befasst sich eher mit CiviCRM-Ismen und ist wahrscheinlich für niemanden von Interesse, der versucht, dieses Problem für eine andere Plattform zu lösen.

2
universalhandle

Mir ist klar, dass es etwas spät ist, aber ...

Ja, Erweiterungen können ihre eigenen Berechtigungen definieren, da es sich bei den "Berechtigungen" im Grunde genommen nur um Zeichenfolgen handelt. Die Standardmethode ist jedoch die Verwendung der von Ihnen oben beschriebenen Datei access.xml der Erweiterung. Die Schritte wären:

  1. Definieren Sie Ihre Berechtigung in der Datei access.xml (normalerweise hätten Sie übersetzbare Textzeichenfolgen für die Beschreibung der Berechtigung usw.).

  2. Verwenden Sie den Standard-Feldtyp "Regeln" von Joomla in einem Formular, damit Administratoren die Berechtigungen für Benutzer eingeben können. Ein wenig zusätzliche Arbeit ist erforderlich, um diese Berechtigungen in der Datenbank zu speichern - sie werden in der Tabelle Joomla Assets gespeichert. Ihre Erweiterung verfügt beispielsweise über einen Asset-Datensatz, und die Berechtigungen werden in einem JSON-Format im Regelfeld dieses Datensatzes gespeichert.

  3. Wenn Sie den Zugriff einschränken möchten, müssen Sie überprüfen, ob ein einzelner Benutzer über Ihre Berechtigung verfügt, z. B .:

JFactory::getUser()->authorise("your.permission", "com_yourcomponent"); gibt je nachdem, ob der Benutzer über die Berechtigung verfügt oder nicht, true oder false zurück.

JHelperContent::getActions("com_yourcomponent"); gibt ein assoziatives Array zurück, das alle Berechtigungen enthält, die Ihrer Erweiterung zugeordnet sind, und ob der angemeldete Benutzer über diese verfügt oder nicht.

Ihre Beschreibung der Funktionen von Joomla ist meines Wissens korrekt. Eine Möglichkeit, die Sie in Betracht ziehen könnten, besteht darin, die Definition Ihrer Berechtigungen lokal in Ihrer eigenen Komponente zu speichern und dann jedes Mal, wenn Sie eine neue Berechtigung definieren, die Datei access.xml programmgesteuert zu generieren. Ich kann jedoch nicht sagen, welche Auswirkungen dies auf die Benutzererfahrung haben würde.

Wie Sie sagen, können Sie die Joomla-Benutzeroberfläche umgehen und die Berechtigungen direkt im Assets-Datensatz speichern. Sie müssen sich jedoch der Vererbung von Benutzer- und Benutzergruppenberechtigungen bewusst sein, die Joomla implementiert, und ich denke, dass dieser Ansatz problematischer sein könnte.

Ich schlage vor, Sie werfen einen Blick auf einige der Tutorial-Informationen im Web bezüglich der Joomla-Berechtigungen, da der Bereich ziemlich komplex ist: dieses Video (in dem eine Erweiterung erwähnt wird, die bei der Konfiguration der Zugriffskontrolle hilfreich ist, aber Ich habe keine Erfahrung damit) und dieser Schritt im Joomla MVC-Entwicklungstutorial .

Viel Glück!

2
Robbie Jackson