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.
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);