web-dev-qa-db-fra.com

Comment ajouter un filtre uniquement pour un chemin spécial WebSecurityConfigurerAdapter

Nous avons une configuration qui ressemble à ceci:

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    public static final String LOGIN_PATH_EXPRESSION = "/login";
    public static final String API_PATH_EXPRESSION = "/api/**/*";
    public static final String GLOBAL_PATH_EXPRESSION = "/**/*";

    @Autowired
    @Qualifier("ssoFilter")
    private Filter ssoFilter;

    @Autowired
    private VerifyingProcessingFilter verifyingProcessingFilter;


    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .userDetailsService(username -> new User(username, "", Collections.emptyList()))
            .sessionManagement()
                .sessionCreationPolicy(SessionCreationPolicy.STATELESS)
            .and()
            .authorizeRequests()
                .antMatchers(LOGIN_PATH_EXPRESSION)
                .authenticated()
                .and()
                .httpBasic()
                .and()
                .authenticationProvider(new SimpleAuthenticationProvider())
            .authorizeRequests()
                .antMatchers(API_PATH_EXPRESSION).authenticated()
                .and()
                .addFilterBefore(ssoFilter, BasicAuthenticationFilter.class)
                .addFilterAfter(verifyingProcessingFilter, FilteredOAuth2AuthenticationProcessingFilter.class)
            .authorizeRequests()
                .antMatchers(GLOBAL_PATH_EXPRESSION)
                .permitAll()
                .and()
                .csrf()
                .disable();
    }

Et reconnu que nous finissons à l'intérieur du FilteredOAuth2AuthenticationProcessingFilter dans un /loginappeler et se demander pourquoi cela se produit.

Le but est que le ssoFilter et le verifyingProcessingFilter ne soient appliqués que lorsque vous atteignez un point de terminaison avec le chemin api/**/*.

À l'heure actuelle, nous devons ajouter une vérification AntMatching à l'intérieur du filtre afin qu'elle ne soit appliquée qu'à la bonne demande, mais je suppose qu'il devrait être possible de l'ajouter uniquement aux demandes correspondantes.

Quelqu'un pourrait-il fournir un exemple sur la façon d'ajouter un filtre à une demande de chemin de correspondance de fourmi spécifique?

7
BennX

Il semble que vous ne puissiez pas faire cela avec une seule classe de configuration. Jetez un œil à cette question: Comment appliquer le filtre de sécurité à ressort uniquement sur les points de terminaison sécurisés? .

Dans ce cas, je pense que la meilleure solution est de configurer plusieurs HttpSecurity. De Spring IO documentation :

Nous pouvons configurer plusieurs instances HttpSecurity tout comme nous pouvons avoir plusieurs blocs. La clé est d'étendre plusieurs fois WebSecurityConfigurationAdapter. Par exemple, ce qui suit est un exemple de configuration différente pour les URL commençant par/api /.

La documentation contient un exemple complet avec les étapes nécessaires pour y parvenir:

  1. Configurer l'authentification comme d'habitude
  2. Créez une instance de WebSecurityConfigurerAdapter qui contient @Order pour spécifier quel WebSecurityConfigurerAdapter doit être considéré en premier.
  3. Le http.antMatcher indique que cette HttpSecurity ne sera applicable qu'aux URL commençant par/api /
  4. Créez une autre instance de WebSecurityConfigurerAdapter. Si l'URL ne commence pas par/api/cette configuration sera utilisée. Cette configuration est prise en compte après ApiWebSecurityConfigurationAdapter car elle a une valeur @Order après 1 (aucune valeur par défaut de @Order ne dure).

Bonne chance!

17
jfneis