J'utilise Grails 1.3.7 et le dernier plugin spring-security-core. J'ai implémenté la méthode suivante dans mon LoginController :
def authAjax = {
response.setHeader 'Location', SpringSecurityUtils.securityConfig.auth.ajaxLoginFormUrl
response.sendError HttpServletResponse.SC_UNAUTHORIZED
}
Et dans mon fichier JavaScript global, j'ai ce qui suit :
$.ajaxSetup({
error: function(xhr, status, err) {
if (xhr.status == 401) {
// display a login form in a dialog
}
}
});
Le formulaire de connexion est le formulaire de connexion standard directement issu de la documentation du plugin. La seule différence est que je soumets mon formulaire en utilisant jQuery comme suit :
var params = $('#ajaxLoginForm').serialize();
$.post($('#ajaxLoginForm').attr('action'), params, function(jsonData) {
if (jsonData.success) {
$('#login-dialog').dialog('close');
} else {
alert('TODO: display errors');
}
}, 'json');
Le problème est que la première fois que je clique sur le bouton de connexion, je semble m'authentifier correctement, mais la réponse du serveur est une redirection 302 basée sur l'en-tête de requête Referer. Le corps de mon $.post() n'est donc jamais exécuté. Je reçois du HTML au lieu de JSON. La méthode LoginController.ajaxSuccess n'est pas exécutée avant la deuxième soumission. J'ai lu et relu la documentation et je dois manquer quelque chose.
MISE À JOUR : Il semble que ce ne soit pas un problème de référent, puisque la deuxième fois que le formulaire est affiché, le référent est toujours là. Je ne comprends donc pas pourquoi je dois soumettre le formulaire deux fois pour que la méthode ajaxSuccess soit appelée.