web-dev-qa-db-fra.com

Spring Boot 2 et migration de la configuration OAuth2

Nous migrons notre application Spring Boot 1.5.7 vers Spring Boot 2 et j'ai remarqué que SecurityProperties.ACCESS_OVERRIDE_ORDER n'est plus disponible.

Nous utilisions @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)) pour forcer un certain ordre de filtres de configuration de sécurité et cela ne fonctionne plus sans cette annotation (obtention de statuts différents car les filtres de sécurité sont dans un ordre incorrect). Existe-t-il un remplacement ou un changement de configuration pour le faire fonctionner à l'ancienne?

Nous avons l'authentification de base + OAuth2 en place.

C'est la dépendance OAuth2 que nous utilisons:

compile group: 'org.springframework.security.oauth', name: 'spring-security-oauth2', version: '2.1.0.RELEASE'

EDIT: Voici mes propriétés WebSecurity:

@Configuration
@Order(SecurityProperties.ACCESS_OVERRIDE_ORDER)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

  private static final String LOGIN = "/login";
  private static final String LOGOUT_SUCCESS = "/login?logout";

  private final UserDetailsService userDetailsService;
  private final AuthenticationManager authenticationManager;

  public WebSecurityConfig(UserDetailsService userDetailsService, @Lazy AuthenticationManager authenticationManager) {
    this.userDetailsService = userDetailsService;
    this.authenticationManager = authenticationManager;
  }

  @Override
  protected void configure(HttpSecurity http) throws Exception {

    // @formatter:off
    http
      // enable cors
      .cors().and()
      .requestMatchers().antMatchers("/oauth/**", "/*").and()
      // These from the above are secured by the following way
      .authorizeRequests().antMatchers("/").permitAll()
      // These from the rest are secured by the following way
      .anyRequest().authenticated().and()
      // Set login page
      .formLogin().loginPage(LOGIN).permitAll().defaultSuccessUrl(PROFILE)
      // Set logout handling
      .and().logout().logoutSuccessUrl(LOGOUT_SUCCESS);
      // @formatter:on

  }

  @Override
  public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers(HttpMethod.OPTIONS, "/**");
  }

  @Override
  protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.parentAuthenticationManager(authenticationManager);
    auth.userDetailsService(userDetailsService);
  }

}

Lors de l'accès à /user via REST, je m'attends à obtenir 401 - Unauthorized sans jeton valide. Je reçois plutôt 302 - Redirect to /login, ce qui signifie que l’authentification de base a une priorité plus élevée. Je ne suis pas sûr de savoir comment résoudre ce problème car tout ordre que j'essaie d'utiliser ne fonctionne pas.

6
Smajl

Donc, il se trouve que le problème ne se trouvait pas dans ma configuration WebSecurity, mais que c'était un peu plus complexe. Spring Security 5 exige que clientSecret soit chiffré avec BCrypt par défaut, ce qui me manquait. En outre, l’ajout du bean AuthenicationManager a résolu le problème.

@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
           return super.authenticationManagerBean();
}

J'ai un exemple de projet avec cette fonctionnalité sur github mais je vais l'améliorer un peu pour résoudre quelques problèmes supplémentaires.

1
Smajl

Avoir le même problème. Juste pour patcher le singe (nous étudierons plus tard le sens réel de l'annotation @Order), j'ai trouvé quelle valeur a été attribuée à ACCESS_OVERRIDE_ORDER dans la version 1.5. * À partir de là https://docs.spring.io/spring-boot/docs/1.5 .10.RELEASE/api/ , qui semble être @Order(2147483640)...

1
A. Tim