2009-05-05 9 views
0

Ich habe Bedenken, wenn es zu GrantedAuthority Objekte in einer Spring Security-Anwendung kommt. Ich suche nach einem guten Weg, um mit den Dingen umzugehen. Zuerst versuche ich, meine Bedenken zu beschreiben, wenn es irgendwelche sachlichen Fehler gibt, zögere nicht, sie darauf hinzuweisen, ich werde nur dankbar sein.Spring Security: Beratung benötigt, wie man GrantedAuthority behandelt

Spring Security verwendet GrantedAuthority-Instanzen als Token der Autorisierung in verschiedenen Teilen der Anwendung.

Standardmäßig kann sich eine GrantedAuthority als String darstellen. Wenn Methoden gesichert werden mit @Secured ("ROLE_NAME") oder URL gesichert die Spring-XML-Konfiguration verwenden oder die HttpServletRequest Anfrage als programmatisch in geprüft, ob (request.isUserInRole ("ROLE_NAME")) {..} Es ist immer die Zeichenfolge, die Sie verwenden, um die Berechtigung anzugeben, nach der gesucht wird.

Ich wundere mich über die Auswirkungen der Verwendung statischer Zeichenfolgen an mehreren Stellen der Anwendung. Wenn ein Rollenname geändert wird, muss der Entwickler alle alten Zeichenfolgen suchen und sie aktualisieren. Es wird kein Fehler bei der Kompilierung auftreten, wenn ein String verpasst wird, nur ein Problem zur Laufzeit.

Was ist der beste Weg, wenn es um die Behandlung von GrantedAuthority-Objekten in einer Spring Security-Anwendung geht? Welche Vor- und Nachteile hat Ihre Lösung?

Antwort

0

Ich sehe hier kein großes Problem. Es ist sehr unwahrscheinlich, dass GrantedAuthority den Schlüssel ändert. Nenne einfach nicht deine Rollen ROLE_A.

Auch bevorzuge ich persönlich XML-Sicherheitskonfiguration über Anmerkungen. Im Allgemeinen, um alle verwandten Konfigurationen an einem Ort zu behalten, sieht nach einer guten Idee aus.

+0

Das Problem, das ich sehe, ist, dass es leicht ist, etwas falsch zu schreiben und nichts darüber herauszufinden, bis die Anwendung getestet oder ausgeführt wird. Es ist ein Plus in meinem Buch, während der Kompilierung von deklarativen Fehlern befreit zu werden. Und es gibt immer ein Gleichgewicht zwischen "verwandten Konfigurationen" zusammenhalten und sie zusammenhalten mit dem, was sie konfigurieren. Zum Beispiel bevorzuge ich Annotationen in den meisten Fällen, in denen sich eine Konfiguration zwischen Test-, Entwicklungsumgebung und Produktumgebung nicht ändert. Deshalb verwende ich Annotationen für Hibernate-Entitäten und XML-Konfiguration für meine Spring-Beans. –

+0

s/altert/alarmiert –

-1

In Spring und anderen Frameworks (insbesondere für dynamische Sprachen) wird "Convention over Configuration" verwendet. Wenn Sie die Rollennamen selbst definieren könnten, finden Sie schnell heraus, dass mehr Codezeilen benötigt werden.

Also halten Sie sich an die Konvention. Verwenden Sie immer die 3 folgenden Rollen, ROLE_ANONYMOUS, ROLE_ADMIN und ROLE_USER. Wenn Sie einen anderen benötigen, benennen Sie ihn entsprechend und verwenden Sie ihn bei allen Gelegenheiten. Dokumentationen sind wichtig.

Auch Gerätetests werden importiert. Es hilft Ihnen in den Fällen, in denen ein Fehler nicht vom Compiler abgefangen wird.

+0

Danke für Ihre Antwort, aber ich denke, Sie sind verwirrt. Convention over Configuration ist damit überhaupt nicht verbunden, ich muss die Rollennamen an jedem Ort konfigurieren, an dem ich sie verwende. Konvention über Konfiguration ist, wenn ich nichts konfigurieren muss, außer wenn ich eine Konvention brechen will. Diese drei Rollennamen können häufig verwendet werden. Aber ich bekomme immer noch keine Kompilierfehler, was meine Beschwerde war. Unit Testing ist sicherlich gut, ich sehe immer noch keinen klaren Vorteil, wenn ich nicht die Möglichkeit habe, Deklarationen vom Compiler zu verwenden. Stille Fehler sind nie eine gute Sache. Alle IMHO. :) –

+0

Mit 'Ich muss die Rollennamen an jedem Ort, an dem ich sie benutze 'konfigurieren Ich meine, dass ich jedes Mal den Namen der akzeptierten Rolle (n) schreibe. Nichts hält mich davon ab, einen Rechtschreibfehler auszuführen, es wird einfach als neue Rolle interpretiert (die kein Benutzer hat). In diesem Sinne konfiguriere ich die ganze Zeit über '@ Secured'. –

+0

Post hat nichts mit Frage zu tun. –

1

Zunächst, wenn möglich, nur Ihre Prüfungen an einer bestimmten Stelle in der Anwendung (z. B. ein HTTP-Interzeptor zu Beginn der Anfrage), und nur einen der genannten Ansätze verwenden. Dies ist eine gute Vorgehensweise, da Sie autorisierend wissen können, wann ein Benutzer autorisiert wird.

Wenn dies nicht möglich ist, verwenden Sie enums für die Rollennamen und vergleichen Sie nur die enums. Wenn Sie also alle Verwendungen in der Anwendung suchen möchten, ist dies eine einfache Suche.

+0

+1. Dieses Problem der Änderung von Strings/make constants/enums ist nichts Besonderes für die Verwendung von Spring Security - eine gute Praxis, egal was passiert. –

+0

Ich verwende eine Kombination aus Methodensicherheit in der Spring- (Service-) Ebene und Komponentensicherheit in der Wicket- (Präsentations-) Ebene. Die Idee ist, dass, wenn etwas in einer der Schichten verpasst wird, es am ehesten in der anderen gefangen ist. Das Risiko, dass Benutzer Code, den sie ausführen dürfen, nicht ausführen dürfen, nimmt ein wenig zu, aber ich denke, es ist es wert. –

+0

Enums verwenden ist genau das, was ich tun möchte. Aber soweit ich gekommen bin, scheint es unmöglich, da die GrantedAuthority-Schnittstelle vergleichbar ist. Das Ergebnis in meiner enum ist 'Namenskonflikt: Die Methode compareTo (Object) vom Typ A hat die gleiche Löschung wie compareTo (T) vom Typ Comparable , überschreibt diese aber nicht, wobei A der Name meiner enum ist. –

Verwandte Themen