Geschrieben von Christian Schnettelker

Schlagwörter: , , , ,

Externe Session-Daten in Joomla

Während der Bearbeitung eines neuen Projektes ergab sich einmal mehr eine knifflige Aufgabenstellung:

  • Auf Daten eines externen PHP-Systems soll innerhalb von Joomla zugegriffen werden, abhängig vom Zustand eingeloggt ja/nein, welcher in separaten Session-Daten vorgehalten wird.
  • Da Joomla seine eigene Session-Verwaltung betreibt sind die externen Session-Daten in Joomla (wohl auch aus Sicherheitsgründen) nicht direkt erreichbar.
  • Die Umprogrammierung des externen Systems hin zur Zusammenarbeit mit Joomla scheidet leider aus.

Nach einigen Überlegungen entwickelte ich die folgende Javascript / Ajax-Lösung, welche ich heute einmal kurz vorstellen möchte:

Schritt 1

Innerhalb des Joomla wird eine Markierung gesetzt, an der später der extern generierte HTML-Code eingefügt wird:

<div id="results"></div>

Das war ja noch einfach.

Schritt 2

Aufruf der verarbeitung.php per Javascript / jQuery über Ajax:

<script>
   jQuery.get( "./php/verarbeitung.php",
      { do: "fall-1" },
      function( data ) { jQuery( '#results' ).html( data ); }
   );
</script>
<noscript>
   <p>+++ Javascript ist deaktiviert +++</p>
</noscript>

Hier habe ich auch gleich noch einen noscript-Hinweis eingebaut für den Fall, dass Javascript deaktiviert sein sollte – dieser Zustand wird heute leider gerne vergessen.

In meinem Falle ist der obige Code direkt in einer Joomla-Seite platziert, dies ermöglicht ein nützliches Plugin namens „Sourcerer“.

Im Code passiert folgendes: die verarbeitung.php wird mit dem Parameter do=fall-1 über Ajax aufgerufen. Die Ausgabe bzw. das Ergebnis (data) dieses Aufrufes setzt jQuery als HTML-Inhalt des DIV mit der ID #results.

Schritt 3

Meine PHP-Datei verarbeitung.php hat den folgenden Inhalt:

<?php
   define( NICHTEINGELOGGT,'<p>+++ Nicht eingeloggt +++</p>' );
   $do = $_REQUEST[ 'do' ];   // Parameter do holen
   sess__init(); // Externe Session-Daten initialisieren
 
   if ( $do == "fall-1" ) {
 
       if ( sess__get('loggedin') == false ) echo NICHTEINGELOGGT;
       else { // Anzeige der Daten nur für eingeloggte Personen
              echo '<p>Anzeige der Daten, Fall 1</p>';
            }
   return;
   }   // Ende Fall 1
   
   // Fehlerhaften Aufruf melden
   echo '<p>+++ do=' . $do . ' undefiniert +++</p>';
?>

Mit dem Parameter „do“ unterscheide ich verschiedene Fälle, damit ich alles in einer PHP-Datei abhandeln kann. Die Funktionen sess__init() und sess__get() sind hier Unterroutinen zur Initialisierung und zur Abfrage der externen Session-Daten und keine Standard-Befehle – es geht in diesem vereinfachten Beispiel auch erst einmal um das prinzipielle Vorgehen.

Cross-Origin

Noch ein Hinweis zum Pfad der PHP-Datei (oben: ./php/verarbeitung.php). Wenn Sie hier einen absoluten Pfad angegeben kann es sein, dass die Ajax-Abfrage nicht funktioniert. Im Konsole-Fenster Ihres Browsers sehen Sie dann eine Meldung ähnlich der Folgenden:

Quellübergreifende (Cross-Origin) Anfrage blockiert: Die Gleiche-Quelle-Regel verbietet das Lesen der externen Ressource auf http://www.manoftaste.de/***********/php/verarbeitung.php?do=fall-1. (Grund: CORS-Kopfzeile 'Access-Control-Allow-Origin' fehlt).

Apache blockiert hier den Zugriff aus Sicherheitsgründen. Verwenden Sie möglichst relative Pfade innerhalb Ihres Auftritts oder, falls dies nicht möglich sein sollte, schalten Sie den Zugriff über ein Kommando in der .htacces-Datei frei:

<IfModule mod_headers.c> 
   Header set Access-Control-Allow-Origin "*"
</IfModule>

Fazit

Bei meinen Tests funktioniert bisher alles zuverlässig. Falls ich einen Fehler gemacht oder eine Situation übersehen haben sollte oder Sie nützliche Hinweise geben können, hinterlassen Sie bitte einen Kommentar.

Pin on PinterestShare on FacebookTweet about this on TwitterShare on Google+Share on LinkedIn

Kommentare

Kommentare

Kommentar schreiben

Allgemeiner Hinweis: Bitte kommentieren Sie zum Thema unter Vermeidung von Allgemeinplätzen und Einzeilern. Eine korrekte Rechtschreibung wird erwartet.

Hinweis für SEO-Kommentarschreiber: alle Links sind nofollow und steigern Eure Linkpopularität nicht. Die Kommentare werden moderiert, offensichtliche SEO-Kommentare nicht veröffentlicht.