Wie Entferne ich die ROLE_ Präfix von Spring Security mit JavaConfig?
Ich versuche das zu entfernen "ROLE_" - Präfix in Spring Security. Das erste, was ich ausprobiert habe, war:
http.servletApi().rolePrefix("");
Das hat nicht funktioniert, also habe ich versucht die Schaffung eines BeanPostProcessor
wie vorgeschlagen in http://docs.spring.io/spring-security/site/migrate/current/3-to-4/html5/migrate-3-to-4-jc.html#m3to4-role-prefixing-disable. Das hat nicht funktioniert entweder.
Schließlich habe ich versucht, meine eigene SecurityExpressionHandler
:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.expressionHandler(webExpressionHandler())
.antMatchers("/restricted").fullyAuthenticated()
.antMatchers("/foo").hasRole("mycustomrolename")
.antMatchers("/**").permitAll();
}
private SecurityExpressionHandler<FilterInvocation> webExpressionHandler() {
DefaultWebSecurityExpressionHandler defaultWebSecurityExpressionHandler = new DefaultWebSecurityExpressionHandler();
defaultWebSecurityExpressionHandler.setDefaultRolePrefix("");
return defaultWebSecurityExpressionHandler;
}
Jedoch hat dies nicht funktioniert. Wenn ich "hasAuthority(Funktionsname)" statt hasRole
, funktioniert es wie erwartet.
Ist es möglich, entfernen Sie das ROLE_ Präfix von Spring Security ist hasRole überprüfen?
- Seltsam ist die
BeanPostProcessor
funktioniert bei mir (du hast es als erklärenstatic
bean-Methode enthalten und diePriorityOrdered
so dass es läuft sehr frühen?) und das gleiche für expression-handlers. Wir haben auch eineDefaultMethodSecurityExpressionHandler
DefaultMethodSecurityExpressionHandler` konfiguriert, die mit dem Präfix festlegen dienull
. - Ja, ich kopierte den code für die
BeanPostProcessor
direkt aus der Dokumentation. Ich habe versucht, den@Bean
in meinem@Configuration
Klasse für Spring Security und in meinem@SpringBootApplication
Klasse. Ich habe eineSystem.out.println
um sicherzustellen, dass es konfiguriert wird, bevor der Frühling Sicherheit auch.hasAuthority
wie erwartet funktioniert, so dass ich denke, ich werde einfach verwenden, statt. - Wir haben es in einer nicht spring-boot-Anwendung. Könnte es sein, dass das stören oder die Sicherheit von boot ist immer noch irgendwie konfiguriert früher?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ab Frühjahr 4.2 definieren Sie den Präfix mit einer einzigen Bohne, wie Sie hier beschrieben: https://github.com/spring-projects/spring-security/issues/4134
XML-version:
Folgende Konfiguration funktioniert bei mir.
Wenn Sie vor 4.2 und sind mit Hilfe von so genannten Wähler (Sie sind, wenn Sie die Verwendung von Annotationen, wie @hasRole etc) dann müssen Sie definieren, unter die Bohnen in der Kontext:
Diese Bohnen werden verwendet, um die Auswertung von Kontext für Zauber Ausdrücke, und Sie haben eine defaultRolePrefix auf 'ROLE_'. Obwohl es hängt von Ihrem Anwendungsfall. Diese funktionierte für mich und den oben nicht.
EDIT: Beantwortung der Frage über xml-Konfiguration -> natürlich kann man das in xml. Alles geschieht in java-config geschrieben werden kann in der xml-Konfiguration. Hier ist ein Beispiel (obwohl ich ihn nicht testen, so könnte es ein Tippfehler oder so):
org.springframework.beans.factory.BeanCreationException: .......; nested exception is java.lang.IllegalArgumentException: A ServletContext is required to configure default servlet handling
Scheint es, dass die neue
GrantedAuthorityDefaults
wird, ändern Sie den Präfix für dieDefaultWebSecurityExpressionHandler
und dieDefaultMethodSecurityExpressionHandler
, aber es verändert nicht dieRoleVoter.rolePrefix
das ist das setup von@EnableGlobalMethodSecurity
.Den RoleVoter.rolePrefix ist, was verwendet wird für
@Secured("ADMIN")
Art von Methode security.Also zusammen mit der
GrantedAuthorityDefaults
hatte ich auch hinzufügen, dieseCustomGlobalMethodSecurity
Klasse zum überschreiben der Standardwerte fürRoleVoter
.@Secured
Anmerkung, da@Secured
Werte ausgewertetRoleVoter
Klasse, und@PreAuthorize
annotation-Ausdruck, der ausgewertet inPreInvocationAuthorizationAdviceVoter
Klasse, Verlag eine beannew GrantedAuthorityDefaults("")
mit Präfix-argument im Konstruktor, die auch Auswirkungen auf@PreAuthorize
.Wenn Sie Spring Boot 2 können Sie erstellen, die diese Bohne zu überschreiben, die RoteVoter Präfix
Funktioniert es denn, wenn GlobalMethodSecurityConfiguration erstellt AccessDecisionManager in der Methode GlobalMethodSecurityConfiguration.accessDecisionManager(). Hier ist das code-snippet, beachten Sie die null-check auf grantedAuthorityDefaults