Kategorie: Symfony

Sulu Sitemap mit Symfony Routen erweitern

Sulu ist ein Content-Management-System, welches mit Hilfe des PHP-Frameworks Symfony erstellt wurde. Das Augenmerk bei Sulu liegt in der leichten Bedienbarkeit für den Entwickler.
Wer oft mit Symfony arbeitet wird merken, wie schnell sich das System an die eigenen Anforderungen anpassen lässt. Dazu müssen keine komplexen Plugins geschrieben werden. Es greifen die herkömmlichen Symfony Standards.

So verhält es sich auch bei der Erstellung einer Sitemap. Sulu bietet bereits eine Schnittstelle, um die Sitemap zu generieren.
Es werden alle Seiten ausgelesen, die im Adminbereich über das CMS System angelegt wurden.

Über folgenden Command kann eine Sitemap initial generiert werden.

bin/websiteconsole sulu:website:dump-sitemap

Im Produktivsystem können Optionen mit übergeben werden, wie z.B.

bin/websiteconsole sulu:website:dump-sitemap --https --env=prod

Meine Ausgangssituation

In meinem Projekt habe ich nun den folgenden Fall:

  • Die meisten Seiten werden direkt über das Sulu CMS im Adminbereich erstellt (z.B. Rezept-Seiten). Es dient als typischer Blog. Das Template ist pro Seitentyp fest definiert.
  • Es gibt jedoch auch Seiten, die direkt in Symfony gepflegt werden, da sie separate Templates oder eine spezielle Logik im Controller besitzen.

Diese Seiten werden standardmäßig in Symfony über die routes.yaml definiert. In Sulu erfolgt dieses unter der Datei routes_websites.yaml.
Meine Datei sieht wie folgt aus:

# config/routes_website.yaml

impressum:
    path: /impressum
    controller: App\Controller\Website\StaticPageController::impressumAction

dataprotection:
    path: /datenschutz
    controller: App\Controller\Website\StaticPageController::dataprotectionAction

contact:
    path: /kontakt
    controller: App\Controller\Website\StaticPageController::contactAction

Diese Routen fehlen bislang in der Sitemap.
Es ist aber sehr einfach die Sulu Sitemap zu erweitern. Es benötigt lediglich 2 Schritte, wobei Schritt 1 optional ist.

Schritt 1 – Konfiguration anpassen (optional)

Ihr könnt über den Parameter sulu_website.sitemap.dump_dir steuern, wo die Sitemap Dateien abgelegt werden sollen. Ich habe hier den public Ordner gewählt.

# /config/services.yml
parameters:
    ...
    sulu_website.sitemap.dump_dir: "%kernel.project_dir%/public/sitemaps"

Schritt 2 – Eigene Provider Klasse anlegen

Als nächstes erstellt ihr eine eigene Provider Klasse.
Diese muss das Interface Sulu\Bundle\WebsiteBundle\Sitemap\SitemapProviderInterface einbinden und die nötigen Methoden implementieren.

Um meine statischen Routen auszulesen, habe ich eine neue Klasse SitemapProvider erstellt. In dem Array $routeNames liste ich die Namen meiner Routen auf, die in die Sitemap aufgenommen werden sollen (siehe Abschnitt: Meine Ausgangssituation)

Hier meine vollständige Klasse:

Das war es auch schon. Die Sitemap kann nun aufgerufen werden unter http://localhost:8080/sitemap.xml

Beim Aufruf werdet ihr sehen, dass Sulu die Sitemap in kleinere Dateien aufteilt. Hier findet ihr auch eure neu angelegte Sitemap mit dem Alias mySitemap , den ihr in der Provider Klasse definiert habt.

<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <sitemap>
        <loc>http://localhost/sitemaps/mySitemap-1.xml</loc>
    </sitemap>
    <sitemap>
        <loc>http://localhost/sitemaps/pages-1.xml</loc>
    </sitemap>
</sitemapindex>

Die Pfade zu den Locations löst Sulu automatisch auf. Darum müsst ihr euch nicht kümmern.
Wenn ihr nun z.B. http://localhost/sitemaps/mySitemap-1.xml aufruft, seht ihr eure definierten statischen Symfony Routen mit den jeweiligen Änderungswerten. Das Auslesen dieser Werte bestimmt ihr selbst in eurer Provider Klasse.

<urlset xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
    <url>
        <loc>http://localhost/impressum</loc>
        <lastmod>2020-06-10</lastmod>
    </url>
    <url>
        <loc>http://localhost/datenschutz</loc>
        <lastmod>2020-06-10</lastmod>
    </url>
    <url>
        <loc>http://localhost/kontakt</loc>
        <lastmod>2020-06-10</lastmod>
    </url>
</urlset>

That’s it !
Nun könnt ihr eure Sitemap verwenden … sie in die robots.txt eintragen, sie bei Google einreichen etc.

Ich hoffe dieser Blog Post ist für einige eine kleine Hilfestellung.

Viel Spaß damit und viele Grüße
Stefanie

In nur 3 Schritten HTTP Basic Authentication in Symfony integrieren – ohne User Entity

Basic Auth Login Dialog

Manchmal ist es von Nöten, dass man eine bestimmte Route in einer Symfony Anwendung mit einem Passwort schützen möchte. Symfony bietet von Haus aus sehr viele Möglichkeiten ein User Management einzubinden.

Bei mir gab es jedoch den Fall, dass ich nur eine bestimmte Route mit einem Passwort schützen wollte. Und dieses auch nur für einen kurzen Zeitraum. Meine restliche Anwendung benötigte bisher keine Rechte und ich wollte für diesen temporären Einsatz den Aufwand so gering wie möglich halten.

Zum Glück bietet Symfony auch für diesen Fall eine Lösung. Die Antwort lautet Memory User Provider. Dieser Provider gehört zu den Standard Authentifizierungs-Providern, die Symfony bereitstellt.

In der Regel sollte der Memory User Provider eher sparsam eingesetzt werden, da er nicht flexibel genug ist, um ein User Management zu integrieren. Aber bei meinem Sonderfall war es genau passend.

Du benötigst nur 3 Schritte, um eine statische Route mit einem Login und einem Passwort zu schützen. Los geht’s !

Schritt 1: Symfony Security Bundle installieren

Falls du das Security Bundle nicht bereits in deiner Anwendung nutzt, musst du es zunächst installieren.

Falls du Symfony Flex nutzt, muss du nichts weiter tun, als das Bundle über Composer zu laden.

Security Bundle über Composer laden

Schritt 2: Password kodieren

Als nächstes musst du das spätere Password für deinen User kodieren. Dazu bietet dir Symfony bereits einen Command.
Gehe in die Console und führe folgenden Task aus

Passwort kodieren

Den Wert, den du nach Ausführen des Commands erhälst, benötigst du für den nächsten Schritt.

Schritt 3: security.yaml anpassen

Im letzten Schritt muss die Konfigurationsdatei unter config/packages/security.yaml angepasst werden.

Hier trägst du nun den Encoder, die zu verschlüsselne Route und deine User mit dem in Schritt 2 gewählten Passwort ein.

Der Encoder wird zwingend benötigt. Andernfalls wird ein Fehler geworfen. Hier reicht der Standard Encoder mit dem Wert auto.

Unter dem Attribut providers gibst du dein generiertes Passwort ein und teilst es dem User zu.

Zuletzt musst du noch deine Route in der Firewall definieren. Hier ist es /my-protected-route. Als Provider bekommt die deinen oberhalb definierten Provider zugewiesen

Das war es schon. Wenn du nun deine Seite aufrufst, solltest du einen Login-Dialog erhalten. Nur dein oben definierter User mit dem entsprechenden Password kann zugreifen.

Login Dialog erscheint beim Aufrufen der Route

So das war es auch schon. Ich denke nicht mal 5 Minuten oder?