Frühjahr 3.2: Filtern der Jackson JSON-Ausgabe basierend auf der Spring Security-Rolle

8

Gibt es eine gute Möglichkeit, die JSON-Ausgabe basierend auf Spring Security-Rollen zu filtern? Ich suche etwas wie @JsonIgnore, aber für Rolle, wie @HasRole ("ROLE_ADMIN"). Wie soll ich das umsetzen?

    
perak 24.06.2013, 12:57
quelle

3 Antworten

9

Ich habe gerade die oben erwähnte Anforderung implementiert. Mein System verwendet Restful Jersey 1.17 , Spring Security 3.0.7 , Jackson 1.9.2 . Aber die Lösung hat nichts mit Jersey Restful API zu tun, und Sie können es auf jeder anderen Art von Servlet Containern verwenden.

Dies sind die gesamten 5 Schritte meiner Lösung:

  1. Zuerst sollten Sie eine Annotation-Klasse für Ihren Zweck erstellen, so:

    JsonSpringView.java

    %Vor%
  2. Dann ein Annotation Introspector, die meisten Methoden sollten null zurückgeben, die Methoden je nach Bedarf ausfüllen, für meine Requirements habe ich gerade isIgnorableField verwendet. Feature ist Meine Implementierung für die GrantedAuthority-Schnittstelle. So:

    JsonSpringViewAnnotationIntrospector.java

    %Vor%
  3. Jersey-Server haben einen Standard ObjectMapper für ihre Serialisierung / Deserialisierung. Wenn Sie ein solches System verwenden und den Standard-ObjectMapper ändern möchten, stehen Ihnen die Schritte 3, 4 und 5 zur Verfügung, ansonsten können Sie diesen Schritt lesen und Ihre Arbeit ist hier erledigt.

    JsonSpringObjectMapperProvider.java

    %Vor%
  4. Sie sollten javax.ws.rs.core.Application erweitern und Ihren Klassennamen in Web.xml angeben. Meine ist RestApplication.Wie das:

    RestApplication.java

    %Vor%
  5. und das ist der letzte Schritt. Sie sollten Ihre Anwendungsklasse (ab Schritt 4) in Ihrer web.xml:

    angeben

    Ein Teil meiner web.xml

    %Vor%

und ab jetzt müssen Sie nur noch die @ JsonSpringView-Annotation Hinter jeder gewünschten Eigenschaft erwähnen. So:

PersonDataTransferObject.java

%Vor%     
hossein bakhtiari 19.09.2013 13:51
quelle
8

Für diejenigen, die hier von Google landen, ist hier eine ähnliche Lösung mit Spring Boot 1.4.

Definieren Sie Schnittstellen für jede Ihrer Rollen, z. B.

%Vor%

Deklarieren Sie @JsonView in Ihren Entitäten, z. B.

%Vor%

Und definieren Sie @ControllerAdvice , um das richtige JsonView basierend auf den Rollen zu übernehmen:

%Vor%     
rcomblen 04.10.2016 12:40
quelle
2

Es ist auch möglich, einen benutzerdefinierten JSON-Verarbeitungsfilter zu schreiben (zB basierend auf JSON Pointers < (a)), es wird ein bisschen komplex zu tun sein.

Die einfachste Möglichkeit besteht darin, ein eigenes DTO zu erstellen und nur die Eigenschaften zuzuordnen, zu denen der Benutzer berechtigt ist.

    
Pavel Horal 24.06.2013 18:57
quelle

Tags und Links