2017-03-03 1 views
11

Ich verwende ein hübsches Vanille-spring-boot-starter-data-rest-Setup und aktivierte die PATCH-Methode. Alles funktioniert, aber ich habe Sicherheitsbedenken und frage mich, was ich am besten dafür empfehle.Sichern von JSON-PATCH-Pfaden in der Spring Boot Data Rest-Anwendung

Das Problem ist, dass PATCHpath s erlauben erreichbare Entitäten von einem anderen Endpunkt aktualisiert werden. Angenommen, ich habe einen comments Endpunkt und einen article Endpunkt. Jeder Kommentar hat eine direkte Zuordnung zu seinem Artikel. Ein Benutzer, der die Berechtigung um einen Kommentar zu bearbeiten hat könnte dann so etwas tun:

PATCH http://some.domain.foo/api/comments/1234 
Content-Type: application/json-patch+json 

[ 
    { "op": "replace", "path": "/article/title", "value": "foobar2" } 
] 

und damit den Titel des Artikels ändern !!

Das ist eindeutig nicht gut.

In diesem Fall muss für andere Teile der API die Zuordnung zum "Artikel" verfahrbar sein. Aber es muss schreibgeschützt sein.

Also ... wie erreiche ich das im Frühling?

Die Anfrage abfangen? Eine Handlermethode implementieren? Schreiben Sie meinen eigenen Controller von Grund auf neu?

Danke!

Antwort

5

Scheint, dass die aktuelle Implementierung von spring-data-rest Pfade in SPEL konvertiert, um Werte direkt auf Beans anzuwenden. Siehe PatchOperation (v2.5.x).

Betrachten Sie diese Optionen:

  • Statt json-Patch verwenden json-fusionieren PATCH Anfrage Teil Updates senden (mit "application/json" oder "application/Merge-patch + json" Inhaltstyp). Dies berücksichtigt @JsonIgnore und andere Jackson Annotationen und behandelt auch Assoziationen unterschiedlich.
  • Sie können disable „json-patch + json“ vollständig, beispielsweise durch ein Sicherheitsfilter Hinzufügen
  • Sie können jederzeit Ihre benutzerdefinierten json-Patch Implementierung erstellen, wenn Sie noch brauchen sie
  • Verwendung auf Anwendungsebene Join, der nicht auf JPA angewiesen ist, dh nur die IDs der verknüpften Entitäten verfügbar macht und benutzerdefinierte Links in Ihrer ResourceProcessor bereitstellt.

Außerdem, wenn Sie JPA verwenden und Comment.article mit @ManyToOne kommentierte stellen Sie sicher, dass keine Kaskadierung auf Vereinigung gibt. Auch wenn das Artikelobjekt mit Patch geändert wird, wird es nicht zusammen mit dem Kommentar gespeichert.

+0

Bis jetzt habe ich eine benutzerdefinierte Methode für die Handhabung von PATCH mit der Anwendung/json-patch + json content-type implementiert. Und das funktioniert. – sofend

+0

Ich kenne die Unterstützung von Spring für json-merge PATCH nicht. Werde sich das ansehen. – sofend

+0

Es gibt keine Kaskadierung der Assoziation, aber die Änderungen werden definitiv beibehalten. Ich glaube nicht, dass es sich um einen Kaskadenmechanismus handelt - das Kaskadierungskonzept trifft hier gar nicht zu. Dies ist eine reine Pfadnavigation in dem Objektgraphen über SpEL, wobei die Änderungen des Graphen von der Sitzung zu der DB bestehen. – sofend

Verwandte Themen