2017-07-16 4 views
0

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.

+0

Verwenden Sie die Autorisierungsmethode, mit der Sie authentifizierten Benutzern Rollen zuweisen – Perry

Antwort

3

Ich denke, Sie brauchen Spring Method Security. Das Beispiel in den Dokumentationen ist fast wörtlich Ihr Fall:

import org.springframework.data.repository.query.Param; 

... 

@PreAuthorize("#n == authentication.name") 
Contact findContactByName(@Param("n") String name); 

PS: Nicht vergessen @EnableGlobalMethodSecurity! Siehe ein Lernprogramm here

+0

Vielen Dank! Das einzige, was in Google für meine Suche auftauchte, war "Securing Spring Boot-Anwendung", die nicht darauf anspricht! Werde jetzt einen Blick darauf werfen! –

+0

Verwendet Ihren Vorschlag aber leider ohne Wirkung. Ich habe meinen Controller zur besseren Übersicht hinzugefügt. –

+2

Sie haben '@ EnableGlobalMethodSecurity'? –

Verwandte Themen