PreAuthorize, die nicht am Controller
Ich versuche zu definieren, die den Zugriff Regeln in der Methode-Niveau, aber es funktioniert nicht, was so überhaupt.
SecurityConfiguration
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().
withUser("user").password("user").roles("USER").and().
withUser("admin").password("admin").roles("ADMIN");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/v2/**").authenticated()
.and()
.httpBasic()
.realmName("Secure api")
.and()
.csrf()
.disable();
}
}
ExampleController
@EnableAutoConfiguration
@RestController
@RequestMapping({"/v2/"})
public class ExampleController {
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
@RequestMapping(value = "/home", method = RequestMethod.GET)
String home() {
return "Hello World";
}
}
Immer, wenn ich versuche, auf /v2/home mit user:user
es führt nur in Ordnung, sollte es nicht geben mir eine Fehlermeldung "Zugriff Verweigert" aufgrund der 'user' nicht mit ROLE_ADMIN
?
Ich bin eigentlich denken der Notwasserung access-Regeln in der Methode-Ebene und bleibe http() ant Regeln, aber ich habe zu wissen, warum es funktioniert nicht für mich.
InformationsquelleAutor der Frage prettyvoid | 2015-09-07
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einem gemeinsamen problem mit PrePost-Anmerkungen auf Controllern ist, die Feder-Methode-Sicherheit basiert auf Spring AOP, die standardmäßig implementiert mit JDK-proxies.
Das bedeutet, dass es gut funktioniert auf der service-Schicht injiziert, die in der controller-Schicht, die als Schnittstellen, aber es wird ignoriert, auf controller-Ebene, weil controller in der Regel keine Schnittstellen implementieren.
Das folgende ist nur meine Meinung:
InformationsquelleAutor der Antwort Serge Ballesta
Müssen Sie
@EnableGlobalMethodSecurity(prePostEnabled = true)
in Ihrem WebSecurityConfig.Finden Sie es hier: http://www.baeldung.com/spring-security-expressions-basic
InformationsquelleAutor der Antwort Eric Zürcher
Ich hatte ein ähnliches problem und Folgendes gelöst:
1) ich musste meine Methode öffentlich (D. H. Ihre Methode home() public)
2) ich habe mit hasRole statt hasAuthority
InformationsquelleAutor der Antwort Horowitzathome
Dafür, dass es funktioniert auf controller-Ebene.
Ich musste @EnableAspectJAutoProxy auf meine Konfiguration Klasse.
Beispiel :
InformationsquelleAutor der Antwort kripal kashyav
Gibt es zwei verschiedene Möglichkeiten, dies zu nutzen, einem Präfix und einem nicht.
Und Sie vielleicht ändern
@PreAuthorize("hasAuthority('ROLE_ADMIN')")
zu@PreAuthorize("hasAuthority('ADMIN')")
ok sein.nächsten ist
@PreAuthorize
source-code.InformationsquelleAutor der Antwort beautifulcode
Wenn Sie eine xml-Kontext-Datei für Ihr Sicherheits-Bohnen und ein separates für Ihre web - /servlet-Kontext, als Sie als hinzufügen müssen:
Ihrem web-context.xml /servlet-Kontext. Dessen nicht genug, fügen Sie es einfach in den security-Kontext von xml.
Seine nicht geerbt in untergeordneten Kontexten.
HTH
InformationsquelleAutor der Antwort Chris