J'ai une appli avec plusieurs utilisateurs et je...

cancel
Showing results for 
Search instead for 
Did you mean: 
ribz33
Active Member

J'ai une appli avec plusieurs utilisateurs et je...

Bonjour,

J'ai une appli avec plusieurs utilisateurs et je veux avoir une connexion à Alfresco par utilisateur.
Donc chaque utilisateur a son ticket dans mon appli.

Pour l'instant j'utilisais
AuthenticationUtils.startSession(login,password)
et
WebServiceFactory.getRepositoryService()
Mais cela ne permet pas de différencier les utilisateurs ! (je prends toujours le dernier ticket crée ce qui est logique avec ce singleton)

Quelqu'un a une idée pour définir mon getRepositoryService avec le Ticket qui va bien ?

Merci d'avance.
9 Replies
sam
Member II

Re: J'ai une appli avec plusieurs utilisateurs et je...

Je crois que ce n'est pas prévu dans le client web service d'Alfresco. Mais il est tout à fait possible de modifier les sources et d'autoriser plusieurs instances des classses.
Personnellement, je n'utilise pas le webservices-client.jar mais les sources directement.
J'avais besoin d'utiliser plusieurs instances de chaque classes, donc j'ai enlevé tous les static.
Et je me suis fait une méthode qui ressemble très fortement AuthenticationUtils.startSession(login,password) mais qui ne stock pas le ticket dans un threadLocal…
Voila ma méthode si ca peut aider :
public String getNouveauTicketDeConnexion(String username, String password) throws AuthenticationFault
  {
    AuthenticationResult result = null;
    try
    {
      /** Démarre la session qu'on ne fermera jamais. TODO vérifier qu'Alfresco a des timeout pour ces tickets, et les supprime au bout de qq temps*/
      result = this.webServiceFactory.getAuthenticationService().startSession(username, password);
    }
    catch (RemoteException exception)
    {
      /** Rethrow the authentication exception */
      if (exception instanceof AuthenticationFault) {throw (AuthenticationFault)exception;}
      /** Throw the exception as a wrapped runtime exception */
      else {throw new WebServiceException("Error starting session.", exception);}
    }
    /** On retourne le ticket épuré de son prefixe TICKET_*/
    return result != null ? result.getTicket().substring("TICKET_".length()) : null;
  }
ribz33
Active Member

Re: J'ai une appli avec plusieurs utilisateurs et je...

Ok c 'est trés interessant !

J'y pensais aussi mais concernant la fonction callbackHandler comment as-tu résolu le problème pour qu'elle prenne le bon ticket pour l'en-tête de sécurité ?

Si tu n'utilises pas ce mécanisme, je serai intéressé de savoir comment tu fais pour t'authentifier au repository avec le ticket.

En gros, mon problème se situe plus au passage de ce ticket pour l'accès au repository…

merci pour la réponse ca me conforte dans mes présentiments…
sam
Member II

Re: J'ai une appli avec plusieurs utilisateurs et je...

En fait, je ne sais pas si on parle de la même chose.

Si c'est juste pour accéder aux fonctionnalités d'alfresco via services web, le client des services web d'Alfresco se débrouille normalement pour donner des tickets différents si on demande plusieurs connections en même temps. Il utilise pour cela un ThreadLocal (cf javadoc) qui permet de stocker le ticket en fonction du thread courant. Par contre, je ne connais pas l'implémentation du client webservice pour PHP…

Si c'est pour accéder à une page d'alfresco directement loggé, en passant sur l'url un ticket de connexion, là c'est différent, et c'est pourquoi j'ai dû créer ma méthode "getNouveauTicketDeConnexion". Mais je n'ai pas encore réussi à me logger sur le client web alfresco de la sorte. J'ai posté un sujet sur le forum anglais, mais je n'ai pas encore eu de réponse…

j'espère avoir été clair…
ribz33
Active Member

Re: J'ai une appli avec plusieurs utilisateurs et je...

D'accord, si je comprends bien pour chaque accès tu dois redemander le ticket.

Je vais essayer d'expliquer plus clairement pour bien que l'on parle de la même chose :
Je vais décrire un cas de multi connexion standard :

- user1 se connecte à mon appli
- mon appli envoie login/pwd de user1 à Alfresco pour obtenir le ticket. (à ce moment Alfresco stocke ce ticket dans la thread)
- mon appli récupère et stocke le ticket dans la session de user1.
- Mon appli recupère les documents de user1 et les affiche par exemple.

- user2 se connecte à mon appli
- mon appli envoie login/pwd de user2 à Alfresco pour obtenir le ticket. (à ce moment Alfresco stocke ce ticket A LA PLACE de celui de user1)
- mon appli récupère et stocke le ticket dans la session de user2.
- Mon appli recupère les documents de user2 et les affiche par exemple.

jusqu'ici tout est ok !

Mais voila mon problème …
user1 veut faire une recherche par exemple, s'il le fait le système va utiliser le ticket de user2 qui est stocké dans le Web Services !
Moi qui ai stocké le ticket de user1 dans sa session j'aimerai le passer au WebServices pour qu'il utilise celui-ci !
La solution simple serait de redemander un nouveau ticket pour user1 mais cela m'embete pour chaque accès d'envoyer login/pwd sur le réseau et en clair ! Dans ce cas le système du ticket ne sert plus à rien presque !

Merci sam pour ton aide sur ce sujet.
Je ne sais pas si une solution existe, ce qui est dommage car je trouve que cela est un cas relativement standard.
sam
Member II

Re: J'ai une appli avec plusieurs utilisateurs et je...

Si tu utilises les webservices d'alfresco pour communiquer, la gestion des tickets est transparente.
Tu n'as pas besoin de stocker les tickets dans ton appli. Il suffit juste de créer une connexion avant chaque communication avec alfresco, puis de la fermer à la fin.
Exemple :
AuthenticationUtils.startSession("user1","password")
//Traitement avec les WS d'alfresco :
Predicate ressourceAEffacer = new Predicate(new Reference[]{new Reference(ConnecteurGEDAlfresco.STORE, idElementGed, null)}, null, null);
CMLDelete cmlDelete = new CMLDelete(ressourceAEffacer);
CML cml = new CML();
cml.setDelete(new CMLDelete[]{cmlDelete});
this.getWebServiceFactory().getRepositoryService().update(cml);
//Fin de la session
AuthenticationUtils.stopSession();
Mais je pense que tu as du t'inspirer des exemples et des tests Junit des webservices, car il ne faut pas trop compter sur la documentation qui est quasi inexistante…
ribz33
Active Member

Re: J'ai une appli avec plusieurs utilisateurs et je...

Merci, je pense que tu as raison il est nécessaire de faire un startSession avant chaque communication ce qui à mon goût n'est pas trés bien car à chaque startSession le Web Services envoie un fichier xml avec le login et le mot de passe en clair.

Cela multiplié par le nombre de startSession pour chaque utilisateur d'une appli, l'interception d'un mot de passe et d'un login a une forte probabilité !

Cette gestion transparente du ticket à mon avis a une sérieuse lacune sur ce point.
Il serait plus propre d'envoyer une fois le login/password, de stocker le ticket attaché au user et de réutiliser ce ticket. Ainsi on envoie sur le réseau qu'une seule fois le login/password en clair.

Merci pour ton aide.
Pour l'instant mon appli n'est pas critique, donc je vais faire comme çà, je verrai peut-être plus tard pour trouver une solution plus propre.

Merci encore. Smiley Very Happy
sam
Member II

Re: J'ai une appli avec plusieurs utilisateurs et je...

Ah oui ? Il n'y a pas de cryptage du mot de passe ?
Si c'est vrai, ce n'est pas trop secure ca :-/
Il faudrait peut-être lever le pb sur le JRA d'Alfresco…
ribz33
Active Member

Re: J'ai une appli avec plusieurs utilisateurs et je...

Ben oui,

et tu peux le voir simplement !
Telecharge tcpmon lance le et place le entre ton appli et le serveur Alfresco.
Tu verras comme ca les messages qui circulent et donc le mot de passe à chaque startSession.
sam
Member II

Re: J'ai une appli avec plusieurs utilisateurs et je...

Oui, je viens de vérifier. C'est d'ailleurs intéressant de regarder les messages SOAP ;-)
Mais bon, personnellement, les échanges avec le serveur Alfresco se font en réseau local, donc cela ne me pose pas spécialement des problèmes de sécurité, mais c'est vrai que si ça passe par le web… Peut-être que d'utiliser un VPN résoudrait ce problème ?