Différence entre registerGlobal(), configure(),configureGlobal (), configureGlobalSecurity dans Spring security

J'ai ci-dessous trois extraits de code qui font tous la même chose: créer une authentification en mémoire. Alors, comment cela affecte-t-il la définition dans différents noms de méthodes?

  1. registerGlobal
  2. configurer
  3. configureGlobal
  4. configureGlobalSecurity

Premier:

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

Deuxième:

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

Troisième:

public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
    auth
         .inMemoryAuthentication()
              .withUser("user").password("password").roles("USER");
}

Quatrième:

@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth)     throws Exception {
    auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");
}

Mise à jour 1: Une chose que je voudrais ajouter:

Configure() méthode est présent dans la classe WebSecurityConfigurerAdapter alors que d'autres ne sont pas présents.

Mise À JOUR 2:

J'ai renommé la méthode dans mon exemple de projet ci-dessous et à ma grande surprise, elle fonctionne et authentifie les utilisateurs.

Vous le nommez n'importe quoi et cela fonctionne

@Autowired
public void anyMethodName(AuthenticationManagerBuilder auth) throws Exception {
            auth.inMemoryAuthentication().withUser("user").password("user").roles("USER");      
}
23
demandé sur ben75 2016-02-05 10:17:25

2 réponses

En fait, vous n'avez que 2 options différentes.

Option 1: utiliser les annotations uniquement (cela couvre vos exemples 1, 3 et 4-notez que vous n'avez pas inclus d'annotations pertinentes dans vos échantillons)

registerGlobal, configureGlobal, configureGlobalSecurity sont exactement de la même manière de faire les choses. Vous pouvez nommer la méthode selon vos goûts. Les seules contraintes sont :

(comme vous pouvez le voir, le nom de la méthode n'est pas important, c'est pourquoi vous avez trouvé tant de noms de méthode différents lors de la recherche d'échantillons de code sur Google)

Voici un exemple de la façon dont il ressemble:

@EnableWebSecurity
public class MyConfiguration {

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

    ...

}

Option 2: utilisation de annotations + méthode overriding (Il couvre votre exemple 2)

La substitution de configure est une approche pratique dans une sous-classe de WebSecurityConfigurerAdapter (ou toute classe @Configuration implémentant WebSecurityConfigurer) mais il ont le même effet que l'autre option.


Comment choisir la bonne approche?

Ce n'est qu'une question de goût/de style de programmation car les deux approches ont le même effet.

La première option a du sens lorsque vous vous voulez / devez conserver votre configuration dans une seule classe,mais votre classe @ Configuration étend déjà une autre classe (et vous ne voulez pas implémenter toute l'interfaceWebSecurityConfigurer ).


Expliquons mon dernier point plus en détail. Spring fournit de nombreuses classes Adaptateur que vous pouvez étendre pour accélérer le développement de votre configuration Spring.

A titre d'exemple, prenons un adaptateur couramment utilisé : WebMvcConfigurerAdapter. Vous commencez avec une configuration très simple comme ceci:

@EnableWebMvc
@Configuration
@ComponentScan({ "com.company.mypackage" })
public class SpringWebConfig extends WebMvcConfigurerAdapter {

}

Ce qui est important ici: votre classe étend déjà une classeAdapter , donc vous ne pouvez pas en étendre une autre


Maintenant, vous devez ajouter une configuration de sécurité. Vous avez le choix entre l'inclure dans votre classe de configuration SpringWebConfig existante ou créer une nouvelle classe de configurationspécifique à la sécurité . Voici un échantillon des deux approches:

1) classe de configuration unique @ approche

Ce qui est important à noter ici : SpringWebConfig étend WebMvcConfigurerAdapter + @EnableWebSecurity

@EnableWebMvc
@Configuration
@ComponentScan({ "com.company.mypackage" })
@EnableWebSecurity
public class SpringWebConfig extends WebMvcConfigurerAdapter {

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


2) de sécurité Spécifique @classe de Configuration

Ce qui est important à noter ici: MySecurityConfig étend WebSecurityConfigurerAdapter

Gardez votreSpringWebConfig tel quel et créez une nouvelle classe @Configuration:

@Configuration
@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {
    @Overide
    public void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
          .withUser("user").password("password").roles("USER").and()
          .withUser("admin").password("password").roles("USER", "ADMIN");
    }
}
34
répondu ben75 2017-04-26 10:34:43

, Pour la différence entre: registerGlobal(AuthenticationManagerBuilder auth) et configureGlobal(AuthenticationManagerBuilder auth)

Le nom de la méthode configureGlobal n'est pas important. Cependant, il est important de configurer uniquement AuthenticationManagerBuilder dans une classe annotée avec @enablewebsecurity, @Enablewebmvcsecurity, @EnableGlobalMethodSecurity ou @enableglobalauthentication. Faire autrement a des résultats imprévisibles.

Source:
Chapitre "création de votre configuration de sécurité Spring" à partir "Bonjour printemps sécurité Java Config" guide.


protected void configure(AuthenticationManagerBuilder auth) est une méthode qui est de nature fournis par WebSecurityConfigurer (et son interface WebSecurityConfigurer) - je dirais que c'est juste un plus type de sauver approche, mais ne diffère pas dans son résultat.

4
répondu Ralph 2017-04-26 09:24:33