Wie überprüfe ich die Berechtigung oder Berechtigung des Benutzers in Java Code? Zum Beispiel - Ich möchte die Schaltfläche für den Benutzer je nach Rolle ein- oder ausblenden. Es gibt Anmerkungen wie:
@PreAuthorize("hasRole('ROLE_USER')")
Wie mache ich es in Java-Code? Etwas wie :
if(somethingHere.hasRole("ROLE_MANAGER")) {
layout.addComponent(new Button("Edit users"));
}
java
spring-security
user-roles
Piotr Gwiazda
quelle
quelle
SecurityContextHolderAwareRequestWrapper
Instanz. Sie können es verbessern, indem Sie erklären, wie Sie es erhalten, und die Antwort selbst ein wenig genauer erläutern.Sie können die isUserInRole-Methode des HttpServletRequest-Objekts verwenden.
etwas wie:
quelle
((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest()
mit der Anfrage? :)Anstatt eine Schleife zu verwenden, um die Berechtigung aus UserDetails zu ermitteln, können Sie Folgendes tun:
quelle
Sie können den Sicherheitskontext abrufen und dann Folgendes verwenden:
quelle
SecurityContextHolder.getContext()
ist nieNULL
, überprüfen Sie die Dokumente. So können Sie vermeiden, den Kontext zu überprüfenNULL
.Sie können eine hasRole () -Methode wie folgt implementieren: (Dies wird unter Spring Security 3.0.x getestet. Bei anderen Versionen sind Sie sich nicht sicher.)
quelle
SecurityContextHolder.getContext().getAuthentication()
kann abrufennull
. Vielleicht fügst du einen Scheck hinzu?Ich benutze dies:
quelle
Sie können Hilfe von der AuthorityUtils- Klasse erhalten. Überprüfung der Rolle als Einzeiler:
Vorsichtsmaßnahme: Hiermit wird die Rollenhierarchie nicht überprüft, sofern eine solche vorhanden ist.
quelle
Die Antwort von JoseK kann nicht verwendet werden, wenn Sie sich in Ihrer Service-Schicht befinden und keine Kopplung mit der Web-Schicht aus dem Verweis auf die HTTP-Anforderung einführen möchten. Wenn Sie die Rollen in der Service-Schicht auflösen möchten, ist Gopis Antwort der richtige Weg.
Es ist jedoch etwas langatmig. Auf die Behörden kann direkt über die Authentifizierung zugegriffen werden. Wenn Sie also davon ausgehen können, dass ein Benutzer angemeldet ist, geschieht Folgendes:
quelle
Den meisten Antworten fehlen einige Punkte:
Rolle und Autorität sind im Frühling nicht dasselbe. Sehen Sie hier für weitere Details.
Rollennamen sind gleich
rolePrefix
+authority
.Das Standardrollenpräfix ist
ROLE_
jedoch konfigurierbar. Siehe hier .Daher muss bei einer ordnungsgemäßen Rollenprüfung das Rollenpräfix berücksichtigt werden, wenn es konfiguriert ist.
Leider ist die Anpassung des Rollenpräfixes in Spring etwas hackig, an vielen Stellen ist das Standardpräfix fest
ROLE_
codiert, aber zusätzlich wird eine Bean vom TypGrantedAuthorityDefaults
im Spring-Kontext überprüft, und falls vorhanden, das benutzerdefinierte Rollenpräfix hat respektiert.Wenn Sie all diese Informationen zusammenführen, wäre eine bessere Implementierung des Rollenprüfers wie folgt:
quelle
Seltsamerweise glaube ich nicht, dass es eine Standardlösung für dieses Problem gibt, da die Spring-Security-Zugriffskontrolle ausdrucksbasiert und nicht java-basiert ist. Sie können den Quellcode für DefaultMethodSecurityExpressionHandler überprüfen, um festzustellen , ob Sie etwas, das dort ausgeführt wird, wiederverwenden können
quelle
Besser spät als nie, lass mich meine 2 Cent einbringen.
In der JSF-Welt habe ich in meiner verwalteten Bean Folgendes getan:
Wie oben erwähnt, ist mein Verständnis, dass es auf die langwierige Weise wie folgt gemacht werden kann:
quelle
Dies ist eine Art Frage vom anderen Ende, aber ich dachte, ich würde sie einwerfen, da ich wirklich im Internet graben musste, um das herauszufinden.
Es gibt eine Menge Dinge darüber, wie man Rollen überprüft, aber nicht viel darüber, was Sie tatsächlich überprüfen, wenn Sie hasRole ("bla") sagen.
HasRole überprüft die erteilten Berechtigungen auf den aktuell authentifizierten Principal
Wenn Sie also hasRole ("bla") sehen, bedeutet dies wirklich hasAuthority ("bla"). .
In dem Fall, den ich gesehen habe, tun Sie dies mit einer Klasse, die UserDetails implementiert und eine Methode namens getAuthorities definiert. In diesem werden Sie im Grunde einige hinzufügen
new SimpleGrantedAuthority("some name")
zu einer Liste hinzu, die auf einer Logik basiert. Die Namen in dieser Liste sind die Dinge, die von den hasRole-Anweisungen überprüft werden.Ich denke in diesem Zusammenhang ist das UserDetails-Objekt der aktuell authentifizierte Principal. Es gibt etwas Magisches in und um Authentifizierungsanbieter und insbesondere den Authentifizierungsmanager, der dies ermöglicht.
quelle
hasRole("bla")
jetzt gleichhasAuthority("ROLE_bla")
.Die @ gouki Antwort ist am besten!
Nur ein Tipp, wie der Frühling das wirklich macht.
Es gibt eine Klasse namens, die
SecurityContextHolderAwareRequestWrapper
das implementiertServletRequestWrapper
Klasse .Das
SecurityContextHolderAwareRequestWrapper
überschreibt denisUserInRole
und SuchbenutzerAuthentication
(der von Spring verwaltet wird), um festzustellen, ob der Benutzer eine Rolle hat oder nicht.SecurityContextHolderAwareRequestWrapper
Der Code lautet wie folgt:quelle
Diese beiden Anmerkungen unten sind gleich. "HasRole" fügt automatisch das Präfix "ROLE_" hinzu. Stellen Sie sicher, dass Sie die richtige Anmerkung haben. Diese Rolle wird in UserDetailsService # loadUserByUsername festgelegt.
Dann können Sie die Rolle in Java-Code erhalten.
quelle
In unserem Projekt verwenden wir eine Rollenhierarchie, während die meisten der obigen Antworten nur darauf abzielen, nach einer bestimmten Rolle zu suchen, dh nur nach der angegebenen Rolle, aber nicht nach dieser Rolle und nach oben in der Hierarchie.
Eine Lösung dafür:
RoleHierarchy ist in spring-security.xml als Bean definiert.
quelle
Fügen Sie Ihrem Benutzermodell einfach eine 'hasRole'-Methode wie unten hinzu
Normalerweise verwende ich es, um zu überprüfen, ob der authentifizierte Benutzer die folgende Rolle als Administrator hat
quelle
Benutzerrollen können auf folgende Arten überprüft werden:
Verwenden statischer Aufrufmethoden in SecurityContextHolder:
Authentication auth = SecurityContextHolder.getContext().getAuthentication(); if (auth != null && auth.getAuthorities().stream().anyMatch(role -> role.getAuthority().equals("ROLE_NAME"))) { //do something}
Verwenden von HttpServletRequest
quelle
Mein Ansatz mit Hilfe von Java8: Wenn Sie durch Koma getrennte Rollen übergeben, erhalten Sie wahr oder falsch
quelle