Hibernate Multi-Tenancy bei Spring-Boot funktioniert nicht wie vermutet
Seit Version 6 verfügt Hibernate über eine Funktion um eine Anwendung mit einer gemeinsame Datenbank mandantenfähig zu machen. Dafür werden die Tabellen um eine Spalte erweitert, die die Kennung des jeweiligen Mandaten enthält. Bei Verwendung dieser Funktion soll sich Hibernate weitgehend automatisch darum kümmern, dass immer nur die Daten des jeweiligen Mandanten abgefragt und geändert werden können.
Leider funktioniert dies zumindest bei der Verwendung von Spring Boot JPA-Repositories bei Spring Boot 3.3.4 nicht durchgängig. Wenn z. B. die Methode findById verwendet wird, können JPA-Entities eines beliebigen Mandaten geladen werden. D. h. diese Methode darf nicht mit ungeprüften Nutzerdaten aufgerufen werden, weil es den Nutzenden sonst ermöglicht wird, Daten eines fremden Mandaten zu laden. Dies kann zu erheblichen Sicherheitsrisiken führen.
findById ist hier nur ein Beispiel. Das Problem tritt auch bei weiteren Methoden auf. Daher ist vor Verwendung des Multi-Tenancy-Features eine genaue Recherche nötig, ob die nötige Funktionalität wirklich gegeben ist. Außerdem sollten automatisierte Testfälle erstellt werden, die die Absicherung der Mandantenfähigkeit gegen fremde Zugriffe prüfen. Insb., weil sich das Verhalten von Hibernate / Spring Boot nachträglich zwischen verschiedenen Versionen geändert hat.
Besonders brisant: Das Spring Boot Blog enthält einen Artikel mit Beispielcode, der mit aktuellen Spring Boot-Versionen nicht mehr funktioniert. Der Beispielcode soll eigentlich genau das Verhalten zeigen, welches in Version 3.3.4 bei der Methode findByID nicht funktioniert: Blogpost bei Spring.io
Leider wurde der Blog-Post bei Spring.io später nicht mehr aktualisiert, obwohl das Problem bekannt ist. Der Testfall aus dem Beispiel, der nicht mehr funktioniert, wurde nämlich im Github-Repository im Jahr 2023 deaktiviert: GitHub Commit