spring-by-pivotal

J’avais évoqué Spring Boot dans un précédent article sur le Paris Java User Group où il était dit que la réalisation d’une application était grandement simplifiée.
Voici donc un exemple de mise en place de services-web REST associés à une couche sécurité permettant de limiter facilement l’accès aux services en fonction de rôles.

Dans cet article je pars directement de l’exemple Spring « Building a RESTful Web Service »

Ajouter la dépendance Maven :

<dependency>
 <groupId>org.springframework.boot</groupId>
 <artifactId>spring-boot-starter-security</artifactId>
</dependency>

La configuration suivante permet de charger les utilisateurs (couples login/password) et leur rôle(s) et de définir un accès uniquement aux utilisateurs authentifiés.

Note : dans l’exemple ci-dessous je charge des utilisateurs manuellement mais en général ces derniers sont chargés depuis une source de données.

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true, proxyTargetClass = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
 
 @Bean
 @Override
 public AuthenticationManager authenticationManagerBean() throws Exception {
 return super.authenticationManagerBean();
 }
 
 @Override
 protected void configure(HttpSecurity http) throws Exception {
 http.authorizeRequests()
 .anyRequest().fullyAuthenticated()
 .and()
 .httpBasic();
 }

@Autowired
 public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
 auth.inMemoryAuthentication()
 .withUser("user").password("user").roles("USER").and()
 .withUser("admin").password("admin").roles("USER", "ADMIN");
 }
}

Les méthodes suivantes ajoutées au contrôler GreetingController peuvent être limitées à un ou plusieurs rôles via l’annotation @Secured :

  • la méthode hello() pourra être appelée par les utilisateur possédant le rôle « USER »
  • la méthode admin() pourra être appelée par les utilisateur possédant le rôle « ADMIN »

Si l’utilisateur ne possède pas le bon rôle une erreur 403 Forbidden sera retournée par le serveur.

@RequestMapping("/hello")
@Secured("ROLE_USER")
public String hello() {
 return "Hello world";
}
 
@RequestMapping("/admin")
@Secured("ROLE_ADMIN")
public String admin() {
 return "You're a super admin";
}

Vous trouverez plus de documentation sur spring-security à cette adresse : http://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle

Publicités