2017-08-06 2 views
2

Ich habe die grundlegenden Spring Boot Security-Funktionen implementiert, um meine Webdienste zu schützen. Ich weiß, dass Sie nur einigen Benutzerrollen Zugriff auf einige Dienste gewähren können, aber ist es auch möglich, einem bestimmten Benutzer Zugriff zu gewähren (Benutzer kann dynamisch sein)?So konfigurieren Sie Spring Boot Security so, dass ein Benutzer nur sein eigenes Profil aktualisieren darf

Nehmen wir an, wir haben eine soziale App, bei der jeder Benutzer sein eigenes Profil hat. Mit dem folgenden Rest-Service, sollten sie das einzige in der Lage sein, um das Profil zu bearbeiten:

@RestController 
public class UserController { 
    @RequestMapping(method = RequestMethod.PUT, path = "/user/{userId}", ...) 
    public UserDetails updateUserDetails(@PathVariable("userId") String userId) { 
     // code for updating the description for the specified user 
    }} 
} 

Wie kann ich mit Feder Sicherheit gewährleisten, dass nur der Benutzer selbst sein persönliches Profil aktualisieren? Jeder andere Benutzer sollte abgelehnt werden. Gibt es eine elegante Möglichkeit, wie Sie dieses Verhalten konfigurieren können?

Ich habe versucht, eine Methode dafür in meiner WebSecurityConfig zu finden, aber ohne Erfolg.

@Configuration 
@EnableWebSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 
    @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
        // configure authorization for urls 
        .authorizeRequests() 
        // grant access to all users for root path and /home 
        //.antMatchers("/", "/home").permitAll() 
        // here i would like to grant access in the way, that only the user is allowed to perform this request by calling url with his userId 
        .antMatchers(HttpMethod.PUT,"/user/<userId>").and().httpBasic(); 
     } 

Was ist ein guter Ansatz, um dieses Verhalten zu implementieren?

Antwort

3

Ich denke, dass der beste Weg, um so etwas zu implementieren wäre, die Principal (Objekt mit dem Benutzer, der für diese Anfrage angemeldet ist) in den Controller injizieren und dann überprüfen, ob die Benutzer-ID oder Benutzername übereinstimmt.

@RestController 
public class UserController { 
    @RequestMapping(method = RequestMethod.PUT, path = "/user/{userId}", ...) 
    public UserDetails updateUserDetails(@PathVariable("userId") String userId, Principal principal) { 

     CustomUserDetails userDetails = (CustomUserDetails) principal; 
     if (userDetails.getUserId().equals(userId)) { 
      // Update the user 
     } 
    }} 
} 

Beachten Sie, dass Sie eine benutzerdefinierte UserDetails Schnittstelle benötigen, wenn Sie die Benutzer-ID hinzufügen möchten, weil sie nur den Benutzernamen standardmäßig zur Verfügung gestellt. Überprüfen Sie diese question, wenn Sie wissen möchten, wie.

3

Verwenden @PreAuthorize Anmerkung:

@PreAuthorize("#userId == principal.userId") 
@RequestMapping(method = RequestMethod.PUT, path = "/user/{userId}", ...) 
public UserDetails updateUserDetails(@PathVariable("userId") String userId) { 
    // code for updating the description for the specified user 
} 

Dies setzt voraus, dass die Klasse, UserDetails Schnittstelle verfügt über eine userId Eigenschaft implementiert.

Verwandte Themen