2016-07-24 13 views
0

Ich habe einen REST-Dienst implementiert, der Spring MVC (RestControllers) mit tokenbasierter Sicherheit (mithilfe von Spring Security) implementiert. Wie kann ich Ressourcen abhängig von der Benutzeridentität filtern? Angenommen, der Benutzer hat einige Berichte. Wie kann ich autorisierten Benutzer durch einen Anruf an /Berichte nur seine Berichte anzeigen lassen?REST-Dienst, der nur aktuelle benutzerbezogene Ressourcen zurückgibt

Offensichtlich kann ich userId zu einem Anfrageparameter oder Pfadvariable machen, aber etwas sagt mir, dass dies eine schlechte Praxis ist.

Ich nehme an, dass ich das mit Spring Security Features erreichen kann, aber wie genau könnte ich das tun und, wichtiger, wo ist der am besten geeignete Ort, um solche Filterung anzuwenden? Sollten die Controller Aufrufe an Dienste ausführen, die die Benutzeridentität weitergeben, oder sollten sie auf der Ebene von Repositorys irgendwie abgerufen werden (ich verwende Spring Data JPA)? Vielen Dank im Voraus

Antwort

0

Sie haben Authentication Objekt aus, wenn ein Benutzer erfolgreich angemeldet ist. Es enthält Object principalObject credentials und Set authorities.

Alles, was Sie tun müssen, ist UserDetailsService überschreiben, um neue Parameter für Ihren authentifizierten Benutzer hinzuzufügen. Fügen Sie Ihre userId in Authentifizierung als shown in blog

Wenn Sie nun tun

SecurityContextHolder.getContext(). GetAuthentication(). GetPrincipal() diese kehren Sie das Benutzerobjekt der Feder Sicherheit. Sie können die Benutzer-ID von hier abrufen und diese im Controller verwenden, um die erforderlichen Aktionen auszuführen.

+0

Sie brauchen keine Sitzung, wie bereits erwähnt Sicherheit wird von Rest impl beibehalten, dies ist nur eine Möglichkeit, benutzerdefinierte Daten zu einem Token zu setzen. –

+0

Danke! Gibt es keine elegantere Möglichkeit, Benutzerinformationen zu erhalten? Verwenden Sie möglicherweise eine der Spring Security-Anmerkungen? Und wo ist der richtige Ort dafür? Controller? – underscore

+0

Sie wollen auch einen Blick auf [Json Web Token] (https://jwt.io/) werfen. Ja, das ist die Vorgehensweise in Spring Security gemäß der Dokumentation. Sie können dies in einem Controller oder sogar in Services tun, da SecurityContextHolder im Kontext statisch ist. –