2017-01-06 3 views
0

In einem JHipster-basierten Projekt müssen bestimmte Spalten basierend auf der angemeldeten Rolle/dem Benutzer selektiv herausgefiltert werden. Alle Benutzer können die meisten Spalten anzeigen, jedoch nur einige privilegierte Spalten Benutzer können bestimmte sichere Felder/Spalten anzeigen/ändern.JHipster Rollenbasierte Maskierung bestimmter Spalten

Es sieht so aus, als ob die einzige Möglichkeit, dies zu erreichen, EntityListeners ist. Ich kann einen EntityListener verwenden und eine bestimmte Spalte während PostLoad Ereignis maskieren. Sagen wir zum Beispiel, ich maskiere die Spalte my_secure_column mit XXX und zeige sie dem Benutzer an.

Der Benutzer ändert dann einige andere Felder/Spalten (zu denen er Zugriff hat) und sendet das Formular. Muss ich die teilweise ausgefüllte Entität erneut in das Ereignis PreUpdate einfangen, den ursprünglichen Wert für my_secure_column aus der Datenbank abrufen und vor dem Fortsetzen festlegen?

All dies scheint ineffizient. Mehrere Stunden durchforstet, konnte jedoch keine spezifische Implementierung finden, die diesem Anwendungsfall am besten entspricht.

Bearbeiten 1: Dies sieht wie ein erster Schritt, um dies auf eine etwas bessere Weise zu erreichen. Updating Entities with Update Query in Spring Data JPA

Ich könnte bestimmte Teilupdates wie updateAsUserRole, updateAsManagerRole usw. verwenden, anstatt die ganze Entität die ganze Zeit zu behalten.

Antwort

1

Säulenbasierte Sicherheit ist kein einfaches Problem zu lösen, und besonders in Kombination mit JPA.

Im Idealfall vermeiden Sie es sogar, die Spalten zu laden, aber da Sie Entitäten auswählen, ist dies standardmäßig nicht möglich, Sie müssen also den eingeschränkten Inhalt entfernen, indem Sie den Wert nach dem Laden überschreiben.

Als Alternative können Sie eine View-Bean (POJO) erstellen und dann JPQL Constructor Expression verwenden. Persönlich würde ich CriteriaBuilder. construct() anstelle der Verkettung einer JPQL-Abfrage verwenden, aber das gleiche Prinzip.

In Bezug auf die Aktualisierung der Daten sollte die UI die Bearbeitung von eingeschränkten Feldern nicht zulassen. Sie müssen jedoch noch im Backend validieren, und ich würde empfehlen, dass Sie vor dem Aufruf von JPA prüfen, ob die Spalte geändert wurde. Normalerweise haben Sie die Änderungen in einem DTO und müssten die Entität trotzdem laden. Wenn eine eingeschränkte Spalte geändert würde, würden Sie einen Fehler zurücksenden. Auf diese Weise rufen Sie JPA nur an, nachdem die Sicherheit überprüft wurde.

+0

In JHipster, normalerweise bei einer Aktualisierung, werden Daten direkt an die Entität gebunden (es ist keine separate DTO erforderlich). Im Normalfall laden wir die Entity nicht. Es ist nur ein Update/Speichern des gebundenen Objekts, das vom Browser empfangen wird. Aber für diesen speziellen Anwendungsfall sieht es so aus, als müssten wir die Entität erneut laden, vergleichen und zusammenführen. Dies scheint eine verschwenderische Übung zu sein. – user1880957

+0

Ich habe JHipster angeschaut, und obwohl es dich zum Laufen bringt, würde ich es nie für die Produktion verwenden. Wie bei jeder Codegenerierung, die versucht, ein allgemeines Rahmenwerk zu erstellen, wird es immer fehlschlagen (meine 13-jährige Meinung). Wir haben Junior-Ressource, die JHipster verwenden wollte, und es gibt Ihnen eine gute Idee, welche Komponenten benötigt werden, aber Sie sollten ein neues Projekt erstellen und das Fett wegschneiden - Das Standard (monolithische) JHipster-Projekt ist 5000 Zeilen, in der Regel Sie brauchen 10% davon, der Rest muss in irgendeiner Weise angepasst werden. Tun Sie sich einen Gefallen und lernen Sie Spring (Core, Boot, Security, Data) –

+0

Ich habe nie die gleiche Klasse wie Entity und DTO verwendet. Ich weiß, dass die meisten JPA-Frameworks integrierte REST-Services zur Manipulation von Daten bieten, aber meiner Erfahrung nach ist dies ein Fehler. Es gibt einfach unterschiedliche Anforderungen an eine Entität und ein DTO, und Sie benötigen oft eine Sicherheitsebene, bevor Sie die Datenbank aktualisieren.Das Erstellen als DTO für Ihre Entitäten ist eine einmalige Aufgabe von etwa 1-5 Minuten, das ist nichts im Vergleich zu der Zeit, die Sie damit verbringen, Ihre Entity-Klasse zu manipulieren, damit sie beides macht. Du kannst mir das Wort sagen oder es selbst lernen;) –

Verwandte Themen