2016-08-16 6 views
3

Ich werde Spring Sicherheit in meinem Javascript Frontend + Spring MVC Projekt (eine Benutzerverwaltung Admin Web App) Ich habe versucht, herauszufinden, ob es irgendwelche Sicherheitsvorteile, diese Frontend HTML-Code vor allem in einem Jsp setzen Datei auf dem gleichen Server wie mein Backend-Code, damit ich bestimmte JSP-Tags nutzen kann. Oder kann ich es perfekt zu einer Ajax-Anwendung machen, das Frontend auf einem anderen Server bedienen. und benutze immer noch Feder Sicherheit voll?Spring Sicherheit ohne Jsp

Antwort

3

Hier nehme ich an:

  • ein Javascript Frontend
  • eine Spring MVC Rest Anwendung dient hauptsächlich JSON

Auf einer sicherheitstechnische Sicht, Feder Sicherheit kann die Hinter- nur schützen Beenden Sie die Anwendung, und Sie sollten sich daran erinnern, dass die Front-End-Sicherheit (Verstecken von Links oder Befehlen in einer Browser-Ansicht) nur eine Illusion ist, weil ein Benutzer immer eine Anfrage erstellen kann, sogar eine Ajax-Anfrage.

Aus Sicht des Benutzererlebnisses ist es klar, dass Sie Ihrem Benutzer nie eine Möglichkeit zeigen sollten, und wenn er es benutzt, sagen Sie ihm, dass es ihm nicht erlaubt ist. Ihr Frontend muss also wissen, welche Privilegien einem Benutzer gewährt werden. Spring security enthält einige Tags, die in JSP-Seiten serverseitig verwendet werden können, aber für ein Javascript-Frontend können Sie (sollte?) Eine spezielle URL-Serverseite implementieren, die die aktuellen Benutzerfähigkeiten zurückgibt, sobald der Benutzer eine Anfrage sendet authentifiziert und das Ergebnis in der Client-Sitzung zwischenspeichern (Windows.sessionStorage). Auf diese Weise weiß Ihr JavaScript-Code, was einem bestimmten Benutzer angezeigt werden sollte.

+0

Gibt es eine Möglichkeit, die verfügbaren URLs für den aktuellen Benutzer zu erhalten? – Sumit

3

Sie können Spring Security verwenden, um die Anforderungs-URLs zu sichern, die Ihre AJAX JSON-Anrufstufe in Ihrem Controller bereitstellen, und genau das würde ich vorschlagen.

Unabhängig davon, wie Sie Features, Daten usw. in Ihrem JS-Frontend ein-/ausblenden, ist es wichtig, die JSON-Aufrufe zu sichern, die die Features und Daten bereitstellen. Auf diese Weise können Sie selbst dann, wenn ein Endanwender versucht, Ihr Frontend zu hacken (und dies möglicherweise, weil es einfach ist), sicherstellen, dass ein REST-Aufruf wegen fehlendem Zugriff fehlschlägt.

Ein wenig Punkt mit Ihrer Frage zu "können Sie" diese sichere vs mit JSP-Tags machen? Absolut - stellen Sie sicher, dass alle Ihre Sicherheit auf der Anrufebene richtig behandelt wird, wie oben beschrieben, und Sie werden eingestellt. Sie sollten Ihre REST/JSON-Dienste wie eine separate Anwendung erstellen, die in jeder Art von Frontend verwendet werden kann.

2

Sie können Spring Security verwenden, um Ihre Serverseite zu sichern, was bedeutet, dass Ihre Frage kurz beantwortet wird: "Kann ich es perfekt zu einer Ajax-Anwendung [..] machen?" Ja.

Für eine Ajax-Anwendung wäre meine Empfehlung, Ihre Serverseite zu einer REST-API zu machen, also nehme ich an, dass dies der Fall ist.

Es gibt zwei Elemente, die zur "Sicherheit" beitragen: Authentifizierung und Autorisierung.

Authentifizierung bedeutet, dass ein Client einige Anmeldeinformationen (wie einen Schlüssel, ein OAuth-Token, eine Kombination aus Benutzer und Kennwort) bereitstellt, die Sie zuversichtlich machen, dass er tatsächlich der ist, für den er sich ausgibt (z. B. Benutzer-ID 12345). Diese Authentifizierung wird von Ihrer Anwendung als Teil einer Sitzung beibehalten. Da Http zustandslos ist, muss jede nachfolgende Anfrage an den Server eine Identifikation der Sitzung senden, so dass der Server sie nachschlagen kann. Sie finden here alles, was Sie über die Authentifizierung mit Spring Security wissen müssen. Ohne zu wissen, wie Ihre Benutzer sich authentifizieren möchten, kann ich nicht genauer sein.

Die Autorisierung ist einfacher: Benutzer-ID 12345 hat möglicherweise nicht Zugriff auf alles. Er könnte zum Beispiel Zugriff auf /widgets/gidgets haben, aber nicht auf /widgets/fidgets. Um dies zu erreichen, ist der einfachste Weg durch die @PreAuthorize Annotation. Erfahren Sie mehr darüber here. Ein Beispiel würde wie folgt aussehen:

@RestController 
@RequestMapping("/widgets") 
public class WidgetController{ 
    @RequestMapping("/gidgets") 
    @PreAuthorize("hasRole('GIDGET_MANAGER')") 
    List<Gidget> getGidgets(){ 
     return gidgetService.getGidgets(); 
    } 

    @RequestMapping("/fidgets") 
    @PreAuthorize("hasRole('FIDGET_MANAGER')") 
    List<Fidget> getFidgets(){ 
     return fidgetService.getFidgets(); 
    } 
} 

Was dies bedeutet, hinter den Kulissen ist, dass sie den Antrag ab, basierend auf dem Pfad, überprüft, ob der derzeit authentifizierte Benutzer hat eine Rolle mit dem angegebenen Namen und erlaubt die Ausführung der Methode im bejahenden Fall. Andernfalls wird die Ausführung der Methode vollständig übersprungen und eine 401 UNAUTHORIZED-Antwort an den Client zurückgegeben.

Verwandte Themen