2010-09-16 4 views
2

Je développe une application GWT + Spring et j'ai du mal à intégrer GWT avec le système Spring Security.Authentification GWT

Les services sont protégés par la sécurité de printemps et la réponse avec 401 pour les utilisateurs non authentifiés (anonyme) et 403 pour un accès non autorisé. Mon problème ici est que je ne peux pas faire en sorte que les AsyncRequests échouées gèrent ces erreurs comme je le veux sans avoir à taper encore et encore sur les stubs de la faille ColdFail pour cette manipulation.

J'ai réussi à développer mon propre filtre pour Spring Security qui répond avec l'en-tête «authorizeform» qui contient l'URL du formulaire de connexion pour l'exception 401. La question est donc: Y a-t-il un moyen de gérer globalement les exceptions 401/403 sans code standard onFailure et rediriger vers l'URL depuis l'en-tête spécifié? Prochaine RequestFactory a quelque chose comme "AuthenticationFailedHandler" mais 2.1 est presque complètement non documenté et "en développement rapide" donc il semble que ce n'est pas une option.

Merci d'avance!

Répondre

0

Un moyen très simple de gérer les échecs de sécurité au niveau de l'application est de définir un rappel abstrait pour votre application qui prendra en charge la passe-partout onFailure dans un endroit cohérent. Pour chaque demande de service dans votre code, vous pourrez utiliser le rappel et mettre en œuvre toute manipulation spécifique.

public abstract class ServiceCallback<T> implements MethodCallback<T> { 
private ServiceCallbackListener listener; 

public ServiceCallback(ServiceCallbackListener serviceCallbackActions) { 
    this.listener = serviceCallbackActions; 
} 

@Override 
public void onFailure(Method method, Throwable exception) { 
    if (method.getResponse().getStatusCode() == 403 || method.getResponse().getStatusCode() == 401) { 
     listener.onUnAuthorizedAccess(); 
    } else { 
     onError(method, exception); 
    } 
} 

public abstract void onError(Method method, Throwable exception); 
} 

Vous pouvez maintenant appeler un service de la manière suivante:

service.callToServer(new ServiceCallback<ServiceResponse>(sessionListener) { 
     @Override 
     public void onSuccess(Method method, ServiceResponse response) { 
      Log.debug("It worked!"); 
     } 

     @Override 
     public void onError(Method method, Throwable exception) { 
      Log.debug("Didn't work.. "); 
     } 
    }); 

Bien sûr, si vous souhaitez que la gestion des erreurs pour être seulement au niveau de l'application, vous pouvez définir onError à être une méthode non abstraite avec un corps vide.