Angular 16 hat klassenbasierte Guards offiziell als veraltet markiert und stattdessen Functional Guards eingeführt. Wer Keycloak für die Authentifizierung nutzt, muss seinen KeycloakAuthGuard entsprechend anpassen.
Der Unterschied ist konzeptionell einfach: Statt einer Klasse, die ein Interface implementiert, schreibt man eine normale Funktion. Angular's inject-Funktion ersetzt den Konstruktor, damit bekommt man KeycloakService und Router ohne den Umweg über Dependency Injection in einer Klasse.
Die Logik selbst bleibt dieselbe: prüfen ob der Nutzer eingeloggt ist, bei Bedarf auf die Login-Seite weiterleiten, sonst die Route freigeben. Zusätzliche Logik wie Rollen-Checks lässt sich über route.data ergänzen.
Wer noch nicht vollständig migrieren möchte, kann auch mapToCanActivate nutzen, eine Hilfsfunktion von Angular 16, die den bestehenden klassenbasierten Guard in das neue Format einbettet. Das ermöglicht eine schrittweise Migration ohne alles auf einmal umzuschreiben.
Den vollständigen Artikel mit Codebeispielen gibt es auf Medium.