Configuration automatique de la sécurité au démarrage du printemps

Configuration automatique de la sécurité de démarrage du printemps

1. introduction

Dans cet article, nous allons examiner l’approche avisée de Spring Boot en matière de sécurité.

En termes simples, nous allons nous concentrer sur la configuration de sécurité par défaut et sur la façon dont nous pouvons la désactiver ou la personnaliser si nécessaire.

Lectures complémentaires:

Spring Security - aucune sécurité, aucun filtre, autorisation d'accèsTous

Les différences entre access = "permitAll", filters = "none", security = "none" dans Spring Security.

Read more

Connexion au formulaire de sécurité du printemps

Exemple de connexion Spring - Comment configurer un formulaire de connexion simple, une configuration XML de sécurité de base et quelques autres techniques de configuration avancées.

Read more

2. Configuration de la sécurité par défaut

Afin d'ajouter la sécurité à notre application Spring Boot, nous devons ajouter lessecurity starter dependency:


    org.springframework.boot
    spring-boot-starter-security

Cela inclura la classeSecurityAutoConfiguration - contenant la configuration de sécurité initiale / par défaut.

Notez que nous n’avons pas spécifié la version ici, en supposant que le projet utilise déjà Boot comme parent.

En termes simples,by default, the Authentication gets enabled for the Application. Also, content negotiation is used to determine if basic or formLogin should be used.

Il existe des propriétés prédéfinies, telles que:

spring.security.user.name
spring.security.user.password

Si nous ne configurons pas le mot de passe à l'aide de la propriété prédéfiniespring.security.user.password et que nous démarrons l'application, nous remarquerons qu'un mot de passe par défaut est généré de manière aléatoire et imprimé dans le journal de la console:

Using default security password: c8be15de-4488-4490-9dc6-fab3f91435c6

Pour plus de valeurs par défaut, consultez la section des propriétés de sécurité de la page de référence deSpring Boot Common Application Properties.

3. Désactivation de la configuration automatique

Pour supprimer la configuration automatique de la sécurité et ajouter notre propre configuration, nous devons exclure la classeSecurityAutoConfiguration.

Cela peut être fait via une simple exclusion:

@SpringBootApplication(exclude = { SecurityAutoConfiguration.class })
public class SpringBootSecurityApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootSecurityApplication.class, args);
    }
}

Ou en ajoutant une configuration dans le fichierapplication.properties:

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

Il existe également des cas particuliers dans lesquels cette configuration ne suffit pas.

Par exemple, presque chaque application Spring Boot est démarrée avec Actuator dans le classpath. This causes problems because another auto-configuration class needs the one we’ve just excluded, l'application ne pourra donc pas démarrer.

Afin de résoudre ce problème, nous devons exclure cette classe; et, spécifique à la situation de l'actionneur, nous devons exclureManagementWebSecurityAutoConfiguration.

3.1. Désactiver contre Surpassant la configuration automatique de la sécurité

Il y a une différence significative entre la désactivation de la configuration automatique et sa dépassement.

En le désactivant, c'est comme ajouter la dépendance Spring Security et toute la configuration à partir de zéro. Cela peut être utile dans plusieurs cas:

  1. Intégration de la sécurité des applications à un fournisseur de sécurité personnalisé

  2. Migration d'une application Spring héritée avec une configuration de sécurité existante - vers Spring Boot

Mais la plupart du temps, nous n’aurons pas besoin de désactiver complètement la configuration automatique de la sécurité.

La façon dont Spring Boot est configuré permet de dépasser la sécurité configurée automatiquement en ajoutant nos nouvelles classes de configuration / personnalisées. C'est généralement plus facile, car nous personnalisons simplement une configuration de sécurité existante pour répondre à nos besoins.

4. Configuration de la sécurité Spring Boot

Si nous avons choisi la voie de la désactivation de la configuration automatique de la sécurité, nous devons naturellement fournir notre propre configuration.

Comme nous l'avons vu précédemment, il s'agit de la configuration de sécurité par défaut; nous pouvons le personnaliser en modifiant le fichier de propriétés.

Nous pouvons, par exemple, remplacer le mot de passe par défaut en ajoutant notre propre:

security.user.password=password

Si nous voulons une configuration plus flexible, avec plusieurs utilisateurs et rôles par exemple, vous devez maintenant utiliser une classe@Configuration complète:

@Configuration
@EnableWebSecurity
public class BasicConfiguration extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth)
      throws Exception {
        auth
          .inMemoryAuthentication()
          .withUser("user")
            .password("password")
            .roles("USER")
            .and()
          .withUser("admin")
            .password("admin")
            .roles("USER", "ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
          .authorizeRequests()
          .anyRequest()
          .authenticated()
          .and()
          .httpBasic();
    }
}

L'annotation@EnableWebSecurity est cruciale si nous désactivons la configuration de sécurité par défaut.

Si elle est manquante, l'application ne pourra pas démarrer. L'annotation n'est facultative que si nous remplaçons simplement le comportement par défaut à l'aide d'unWebSecurityConfigurerAdapter.

Maintenant, nous devrions vérifier que notre configuration de sécurité s’applique correctement en effectuant quelques tests rapides:

@RunWith(SpringRunner.class)
@SpringBootTest(webEnvironment = RANDOM_PORT)
public class BasicConfigurationIntegrationTest {

    TestRestTemplate restTemplate;
    URL base;
    @LocalServerPort int port;

    @Before
    public void setUp() throws MalformedURLException {
        restTemplate = new TestRestTemplate("user", "password");
        base = new URL("http://localhost:" + port);
    }

    @Test
    public void whenLoggedUserRequestsHomePage_ThenSuccess()
     throws IllegalStateException, IOException {
        ResponseEntity response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.OK, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("example"));
    }

    @Test
    public void whenUserWithWrongCredentials_thenUnauthorizedPage()
      throws Exception {

        restTemplate = new TestRestTemplate("user", "wrongpassword");
        ResponseEntity response
          = restTemplate.getForEntity(base.toString(), String.class);

        assertEquals(HttpStatus.UNAUTHORIZED, response.getStatusCode());
        assertTrue(response
          .getBody()
          .contains("Unauthorized"));
    }
}

L'idée est que derrière Spring Boot Security se trouve en fait Spring Security. Ainsi, toute configuration de sécurité pouvant être effectuée avec celui-ci, ou toute intégration prise en charge par celle-ci, peut également être implémentée dans Spring Boot.

5. Configuration automatique de Spring Boot OAuth2

Spring Boot prend en charge la configuration automatique dédiée à OAuth2.

Avant d'en arriver là, ajoutons la dépendance Maven pour commencer à configurer notre application:


   org.springframework.security.oauth
   spring-security-oauth2

Cette dépendance inclut un ensemble de classes capables de déclencher le mécanisme de configuration automatique défini dans la classeOAuth2AutoConfiguration.

Nous avons maintenant plusieurs choix à poursuivre, en fonction de la portée de notre application.

5.1. Configuration automatique du serveur d'autorisation OAuth2

Si nous voulons que notre application soit un fournisseur OAuth2, nous pouvons utiliser@EnableAuthorizationServer.

Au démarrage, nous remarquerons dans les journaux que les classes de configuration automatique généreront un identifiant client et un secret client pour notre serveur d'autorisation et bien sûr un mot de passe aléatoire pour l'authentification de base.

Using default security password: a81cb256-f243-40c0-a585-81ce1b952a98
security.oauth2.client.client-id = 39d2835b-1f87-4a77-9798-e2975f36972e
security.oauth2.client.client-secret = f1463f8b-0791-46fe-9269-521b86c55b71

Ces informations d'identification peuvent être utilisées pour obtenir un jeton d'accès:

curl -X POST -u 39d2835b-1f87-4a77-9798-e2975f36972e:f1463f8b-0791-46fe-9269-521b86c55b71 \
 -d grant_type=client_credentials
 -d username=user
 -d password=a81cb256-f243-40c0-a585-81ce1b952a98 \
 -d scope=write  http://localhost:8080/oauth/token

5.2. Autres paramètres de configuration automatique Spring Boot OAuth2

Spring Boot OAuth2 couvre d’autres cas d’utilisation tels que:

  1. Serveur de ressources -@EnableResourceServer

  2. Application cliente -@EnableOAuth2Sso ou@EnableOAuth2Client

Si nous avons besoin que notre application appartienne à l'un des types ci-dessus, il suffit d'ajouter une configuration aux propriétés de l'application.

Toutes les propriétés spécifiques d'OAuth2 peuvent être trouvées àSpring Boot Common Application Properties.

6. Sécurité Spring Boot 2 vs Sécurité Spring Boot 1

Par rapport à Spring Boot 1,Spring Boot 2 has greatly simplified the auto-configuration.

Dans Spring Boot 2, si nous voulons notre propre configuration de sécurité, nous pouvons simplement ajouter unWebSecurityConfigurerAdapter. personnalisé. Cela désactivera la configuration automatique par défaut et activera notre configuration de sécurité personnalisée.

Spring Boot 2 utilise la plupart des valeurs par défaut de Spring Security. Pour cette raison,some of the endpoints that were unsecured by default in Spring Boot 1 are now secured by default.

Ces points de terminaison incluent des ressources statiques telles que / css /, /js/, / images /, /webjars/, /**/favicon.ico et le point de terminaison d'erreur. Si nous devons autoriser un accès non authentifié à ces points de terminaison, nous pouvons le configurer explicitement.

Pour simplifier la configuration liée à la sécurité,Spring Boot 2 has removed the following Spring Boot 1 properties:

security.basic.authorize-mode
security.basic.enabled
security.basic.path
security.basic.realm
security.enable-csrf
security.headers.cache
security.headers.content-security-policy
security.headers.content-security-policy-mode
security.headers.content-type
security.headers.frame
security.headers.hsts
security.headers.xss
security.ignored
security.require-ssl
security.sessions

7. Conclusion

Dans cet article, nous nous sommes concentrés sur la configuration de sécurité par défaut fournie par Spring Boot. Nous avons vu comment le mécanisme de configuration automatique de la sécurité peut être désactivé ou remplacé et comment une nouvelle configuration de sécurité peut être appliquée.

Le code source peut être trouvéover on Github.