2010-02-13 16 views
1

J'ai une application Web Spring Security (basée sur l'authentification par formulaire) qui exécute les services Web CXF JAX-RS et j'essaie de me connecter à ce service Web à partir d'une application Android qui peut être authentifiée par utilisateur. Actuellement, lorsque j'ajoute une annotation @Secured à ma méthode de service Web, toutes les demandes à cette méthode sont refusées. J'ai essayé de transmettre les informations d'identification d'un utilisateur/mot de passe valide (qui existe actuellement dans l'application Web Spring Security et peut se connecter à l'application Web avec succès) à partir de l'appel android mais la requête ne parvient toujours pas à L'annotation sécurisée est présente. Le paramètre SecurityContext renvoie null lors de l'appel de getUserPrincipal().Comment faire une demande à partir d'une application Android qui peut entrer dans une méthode de service web sécurisé Spring Security?

Comment puis-je effectuer une demande auprès d'une application Android pouvant accéder à une méthode de service Web sécurisée Spring Security?

Voici le code, je travaille avec au moment:

appel Android:

httpclient.getCredentialsProvider().setCredentials(
      //new AuthScope("192.168.1.101", 80), 
      new AuthScope(null, -1), 
     new UsernamePasswordCredentials("joeuser", "mypassword")); 

    String userAgent = "Android/" + getVersion();  


    HttpGet httpget = new HttpGet(MY_URI); 
    httpget.setHeader("User-Agent", userAgent); 
    httpget.setHeader("Content-Type", "application/xml"); 

    HttpResponse response; 

    try { 
     response = httpclient.execute(httpget); 
     HttpEntity entity = response.getEntity(); 

     ... parse xml 

Webservice Méthode:

@GET 
@Path("/payload") 
@Produces("application/XML") 
@Secured({"ROLE_USER","ROLE_ADMIN","ROLE_GUEST"}) 
public Response makePayload(@Context Request request, @Context SecurityContext securityContext){ 

     Payload payload = new Payload(); 
     payload.setUsersOnline(new Long(200)); 

      if (payload == null) { 
       return Response.noContent().build(); 
      } 
      else{ 
       return Response.ok().entity(payload).build(); 
      } 

} 
+1

Pouvez-vous accéder à ce service à partir d'un autre client, par ex. SoapUI? C'est à dire. Votre sécurité sur le serveur est-elle correctement configurée? – Tomas

Répondre

1

Je l'ai résoudre ce problème. Dans mon cas, le problème était que j'avais ajouté par erreur des annotations de sécurité sur des méthodes qui étaient déjà suivies dans Spring Security à partir d'une configuration dans un modèle d'intercept-url dans un fichier xml Spring Security. Après tout a été dit et fait, il est très simple et fonctionne très bien. La seule astuce est que votre client Android doit créer un DefaultHttpClient statique, appeler le servlet de connexion de votre site Web avec ce client, puis effectuer tous les appels suivants en utilisant la même instance httpClient. Vos requêtes android peuvent alors entrer des méthodes sécurisées, maintenir une session et être traitées comme n'importe quel utilisateur normal.

Le code suivant de ma première question est superfulous et je ne l'utilisez pas du tout: httpclient.getCredentialsProvider().setCredentials(... Comme éludée, je ne suis pas également en utilisant les annotations de sécurité que j'ai mes urls garantis dans un fichier xml.