Ich versuche, Zugriffsregeln auf Methodenebene zu definieren, aber es funktioniert nicht, was auch immer.PreAuthorize funktioniert nicht auf Controller
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/zuzugreifen v2/home user:user
mit der Ausführung ganz gut, sollte es mir nicht einen Zugriff verweigert Fehler geben wegen ‚user 'nicht haben ROLE_ADMIN
?
Ich denke eigentlich daran, Zugriffsregeln auf Methodenebene zu löschen und bei http() zu bleiben, aber ich muss wissen, warum es für mich nicht funktioniert.
Danke für die Antwort. Ich habe versucht, die Annotation auf einer "CrudRepository" -Schnittstelle zu verwenden, und es hat gut funktioniert.Eine Schnittstelle zu jedem Controller zu haben, ist meiner Meinung nach irgendwie albern, da eine Schnittstelle nicht wirklich notwendig ist. 'proxy-target-class = true' hat keinen Unterschied gemacht, die Annotationen funktionieren immer noch nicht auf Controllern, haben jedoch einen Absturz verursacht (wenn sie auf true gesetzt sind), wenn die Annotation in der Repository-Schnittstelle enthalten ist. sun.proxy). Jedenfalls glaube ich, dass ich mich an die Regeln in der Sicherheitskonfiguration halte und vielleicht PreAuth für einige meiner Repositories verwende. – prettyvoid
Eine andere Sache, die ich bemerkt habe, ich habe Beispiele gesehen, wo die @ PreAuthorize in einer 'Klasse' anstatt einer' Schnittstelle' verwendet wurde und es funktioniert. Ich frage mich, warum es für sie funktioniert, aber nicht für mich. – prettyvoid
Aktivieren Aop im Anwendungskontext –