web-dev-qa-db-fra.com

Comment définir un AuthenticationEntryPoint personnalisé sans configuration XML

Je lutte depuis quelques jours maintenant. Je suis un peu nouveau dans Spring Boot et j'aime l'idée de ne pas utiliser la configuration XML.

J'ai créé une application RESTfull (avec JSON). Je suis ce tutoriel pour configurer correctement l'authentification.

Je pense que j'ai réussi à reproduire presque toutes ses configurations en utilisant Java, sauf pour une chose - AuthenticationEntryPoint

Le didacticiel utilise une propriété dans la balise http comme celle-ci et définit un formLogin de la manière suivante:

<http entry-point-ref="restAuthenticationEntryPoint">

  <intercept-url pattern="/api/admin/**" access="ROLE_ADMIN"/>

  <form-login
     authentication-success-handler-ref="mySuccessHandler"
     authentication-failure-handler-ref="myFailureHandler"
  />

  <logout />

</http>

L'explication AuthenticationEntryPoint dans le Spring Security manual dit:

AuthenticationEntryPoint peut être défini à l'aide de l'attribut entry-point-ref sur l'élément <http>.

Ne mentionne rien sur la façon de le faire en utilisant Java Configuration.

Alors, comment puis-je "enregistrer" mon propre restAuthenticationEntryPoint sans XML afin d'empêcher la redirection vers un formulaire de connexion lorsque j'utilise formLogin?

Ci-dessous, je mentionnerai ce que j'ai essayé.

Merci à tous.


Dans mes tentatives, j'ai trouvé que vous pouvez le définir en utilisant basicAuth comme ceci:

@Configuration
@Order(1)                                                        
public static class RestWebSecurityConfigurationAdapter extends WebSecurityConfigurerAdapter {

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


        if (restAuthenticationEntryPoint == null) {
            restAuthenticationEntryPoint = new RestAuthenticationEntryPoint();
        }

        http
            .authorizeRequests()
                .antMatchers("/**").hasAnyRole(Sec.ADMIN,Sec.SUPER_USER)
...
        .and()
            .httpBasic()
                .authenticationEntryPoint(restAuthenticationEntryPoint)

Mais j'utilise un formulaire de connexion comme celui-ci (sans la partie httpBasic):

        .and()
            .formLogin()
                .successHandler(mySavedRequestAwareAuthenticationSuccessHandler)
                .failureHandler(simpleUrlAuthenticationFailureHandler)

Le problème est qu'il redirige vers un formulaire de connexion lorsqu'il ne reçoit pas d'informations d'identification. Comme il s'agit d'un service REST, il ne devrait pas.

documentation pour FormLoginConfigurer (la classe .formLogin() utilise) dit:

Objets partagés créés

Les objets partagés suivants sont remplis

AuthenticationEntryPoint

Mais je n'ai pas pu trouver un moyen de le contourner.
Des idées?

P.S.
Ne pensez pas que ce serait une bonne idée de remplacer le formulaire de connexion par un formulaire personnalisé qui ne renvoie que l'erreur.

27
elysch

La citation des documents de référence que vous avez fournis vous pointe vers http.exceptionHandling(). Vous pouvez y configurer le point d'entrée partagé.

http.exceptionHandling().authenticationEntryPoint(myEntryPoint);
51
Dave Syer