Ich entwickle eine Spring-Boot-App und Schreiben einer API für Benutzer in der Lage sein, Nachrichten zu lesen. Einer der URL ist:Frühling Sicherheit erlauben Zugriff nur Benutzer mit bestimmten Benutzernamen
/users/USER1/messages
Nun, ich möchte natürlich nur authentifizierte Benutzer in der Lage sein, den Inhalt dieser Anfrage erhalten zuzugreifen. Aber alle authentifizierten Benutzer sind nicht genug. Ich möchte auch, dass nur Benutzer mit einem Benutzernamen - USER1 in der Lage sein werden, den echten Inhalt hier anzuzeigen, Rest sollte 403 Status erhalten. Ich habe herausgefunden, wie es ohne Spring Security Config funktioniert (in meinem Dienst überprüfe ich den angemeldeten Benutzernamen und vergleiche ihn mit dem Parameter in der URL, nur wenn sie gleich sind), aber ich denke, dass es einen einfacheren Weg geben sollte Verwenden Sie nur SecurityConfiguration? Meine aktuelle Konfiguration sieht wie folgt aus:
@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.antMatchers(HttpMethod.GET, "https://stackoverflow.com/users/**").authenticated()
.antMatchers("/h2-console/*").permitAll()
.anyRequest().authenticated()
.and()
.formLogin();
http.csrf().disable();
http.headers().frameOptions().disable();
}
@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("superman").password("superman").roles("USER")
.and()
.withUser("admin").password("admin").roles("ADMIN");
}
}
EDIT: Antwort Im Anschluss darauf hindeutet Methode Sicherheit Ausdrücke Ich habe es verwendet, aber es scheint immer noch nicht zu arbeiten (wenn ich authentifiziert bin als USER2 ich immer noch Nachrichten für USER1 lesen können). Hier ist mein Controller, wo ich hinzugefügt haben vorzuauthorisieren Anmerkung
@RequestMapping(method = RequestMethod.GET, value = "/messages", produces = {"application/json"})
@ResponseBody
@PreAuthorize("#userHandle == authentication.name")
public List<Message> getMessages(@PathVariable("userHandle") String userHandle,
@RequestParam(value="search", defaultValue="") String search) {
//todo: change to return DTO not model
return messageFacade.getMessages(userHandle, search);
}
EDIT2: Wie in den Kommentaren in akzeptierte Antwort @EnableGlobalMethodSecurity (prePostEnabled = true) in der Sicherheitskonfigurations enthalten sein muss. Sobald das inklusive ist, funktioniert alles gut.
Verwenden Sie die Autorisierungsmethode, mit der Sie authentifizierten Benutzern Rollen zuweisen – Perry