Il contenuto di questo sito è rilasciato sotto licenza Creative Commons License se non specificato diversamente

Autenticazione e utilizzo dei webservice di alfresco senza la sdk remote

:!: Non mi interessa se voi usate la SDK remote o se la SDK remote sia migliore o peggiore di axis o altri strumenti per webservices. Di seguito ci sono le istruzioni per autenticarsi in alfresco tramite webservices con uno strumento “generico”, nel mio caso AXIS

Per connettersi ai WS di alfresco è necessario usare WSS4j per passare credenziali utente e ticket. E' comunque necessario prestare attenzione ad alcune cose

client_deploy.wsdd

Il file per il deploy del client axis deve essere simile al seguente

  <deployment xmlns='http://xml.apache.org/axis/wsdd/' 
               xmlns:java='http://xml.apache.org/axis/wsdd/providers/java'>
      <transport name='http' 
                 pivot='java:org.apache.axis.transport.http.HTTPSender'/>
      <globalConfiguration >
         <requestFlow >
            <handler type='java:org.apache.ws.axis.security.WSDoAllSender' >
               <parameter name='action' value='UsernameToken Timestamp'/>
               <parameter name='user' value='ticket'/>
               <parameter name='passwordCallbackClass'
                value='mains.AlfresoPWCallback'/>
               <parameter name='passwordType' value='PasswordText'/>
            </handler>
         </requestFlow >
      </globalConfiguration>
    </deployment>

attenzione al Timestamp che va passato per forza! (la doc di alfresco non lo maneziona)

user e password handler

l'handler per gestire i ticket e le credenziali deve essere tipo il seguente

public class AlfresoPWCallback implements CallbackHandler {
    public void handle(Callback[] callbacks) 
                throws IOException, UnsupportedCallbackException
    {
 
       for (int i = 0; i < callbacks.length; i++) 
       {
          if (callbacks[i] instanceof WSPasswordCallback) 
          {
             WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
             String currentTicket = 
                __TROVA_UN_MODO_DI_PASSARE_UNA_PASSWORD_TIPO_CON_UN_THREADLOCAL_O_CHE_TI_PARE;
             pc.setPassword(currentTicket);
          }
          else 
          {
             throw new UnsupportedCallbackException(callbacks[i], 
                       "Unrecognized Callback");
          }
       }
    } 
}

inizializzatore WS

Schema

  1. Caricare engineconfig con file client_deploy.wsdd (si può fare anche in via programamtica e sarebbe meglio ma non ho studiato le API e non sono sicuro di come si faccia)
  2. Autenticarsi tramite webservice prendendo il ticket
  3. Chiamare i webservice con l'engineconfig creato precedentemente
  4. Disconnette la sessione tramite webservice
String alfresco_base = "http://alfresco.mio.dominio/alfresco";
EngineConfiguration econfig = new FileProvider("client_deploy.wsdd");
AuthenticationServiceLocator authenticationServiceLocator = new AuthenticationServiceLocator();
AuthenticationServiceSoapPort auth = authenticationServiceLocator.
  getAuthenticationService(new URL(alfresco_base +
		"/api/AuthenticationService"));
String password = "password";
AuthenticationResult sess = auth.startSession("pippo", password);
String ticket = sess.getTicket();
METTI_IL_TICKET_DA_QUALCHE_PARTE
UN_THREADLOCAL_VA_BENE
... chiama WS
AdministrationServiceLocator asl = new AdministrationServiceLocator(econfig);
AdministrationServiceSoapPort adminService =
	asl.getAdministrationService(new URL
	( alfresco_base + "/api/AdministrationService"));
UserDetails u = adminService.getUser("pippo");
System.out.println(u.getUserName());;
.. fine chiama WS
auth.endSession(ticket);

Argument qname is mandatory

Se durante una chiamata al webservice viene generato un messaggio di errore tipo <note important>… argument qname is mandatory …</note> allora è bene controllare i parametri passati ai metodi degli stub. L'argomento property deve essere non vuoto (basta anche una stringa con uno spazio)

File completi

client_config.wsdd

  <deployment xmlns='http://xml.apache.org/axis/wsdd/' 
               xmlns:java='http://xml.apache.org/axis/wsdd/providers/java'>
      <transport name='http' 
                 pivot='java:org.apache.axis.transport.http.HTTPSender'/>
      <globalConfiguration >
         <requestFlow >
            <handler type='java:org.apache.ws.axis.security.WSDoAllSender' >
               <parameter name='action' value='UsernameToken Timestamp'/>
               <parameter name='user' value='ticket'/>
               <parameter name='passwordCallbackClass'
                value='mains.AlfresoPWCallback'/>
               <parameter name='passwordType' value='PasswordText'/>
            </handler>
         </requestFlow >
      </globalConfiguration>
    </deployment>

AlfresoPWCallback.java

package mains;
import java.io.IOException;
 
import javax.security.auth.callback.Callback;
import javax.security.auth.callback.CallbackHandler;
import javax.security.auth.callback.UnsupportedCallbackException;
 
import mains.Staticone;
 
import org.apache.ws.security.WSPasswordCallback;
 
 
public class AlfresoPWCallback implements CallbackHandler {
 
	 /**
     * The implementation of the password callback used by the WS Security
     * 
     * @see javax.security.auth.callback.CallbackHandler#handle(javax.security.auth.callback.Callback[])
     */
    public void handle(Callback[] callbacks) 
                throws IOException, UnsupportedCallbackException
    {
 
       for (int i = 0; i < callbacks.length; i++) 
       {
          if (callbacks[i] instanceof WSPasswordCallback) 
          {
             WSPasswordCallback pc = (WSPasswordCallback)callbacks[i];
             String currentTicket = Staticone.getPass();
             // Set the password to be the current users ticket
 
             pc.setPassword(currentTicket);
          }
          else 
          {
             throw new UnsupportedCallbackException(callbacks[i], 
                       "Unrecognized Callback");
          }
       }
    } 
}

staticone

package mains;
 
public class Staticone {
	private static ThreadLocal<String> pass = new ThreadLocal<String>();
 
	public static void setPass(String p) {
		pass.set(p);
	}
 
	public static String getPass() {
		return pass.get();
	}
	public static void remove() {
		pass.remove();
	}
 
}

main

 
package mains;
 
import java.net.MalformedURLException;
import java.net.URL;
 
import javax.xml.rpc.ServiceException;
 
import org.alfresco.www.ws.model.content._1_0.ContentFormat;
import org.alfresco.www.ws.model.content._1_0.NamedValue;
import org.alfresco.www.ws.model.content._1_0.Predicate;
import org.alfresco.www.ws.model.content._1_0.Reference;
import org.alfresco.www.ws.model.content._1_0.ResultSet;
import org.alfresco.www.ws.model.content._1_0.ResultSetRow;
import org.alfresco.www.ws.model.content._1_0.ResultSetRowNode;
import org.alfresco.www.ws.model.content._1_0.Store;
import org.alfresco.www.ws.service.administration._1_0.AdministrationServiceLocator;
import org.alfresco.www.ws.service.administration._1_0.AdministrationServiceSoapPort;
import org.alfresco.www.ws.service.administration._1_0.UserDetails;
import org.alfresco.www.ws.service.authentication._1_0.AuthenticationResult;
import org.alfresco.www.ws.service.authentication._1_0.AuthenticationServiceLocator;
import org.alfresco.www.ws.service.authentication._1_0.AuthenticationServiceSoapPort;
import org.alfresco.www.ws.service.content._1_0.Content;
import org.alfresco.www.ws.service.content._1_0.ContentServiceLocator;
import org.alfresco.www.ws.service.content._1_0.ContentServiceSoapPort;
import org.alfresco.www.ws.service.repository._1_0.QueryResult;
import org.alfresco.www.ws.service.repository._1_0.RepositoryServiceLocator;
import org.alfresco.www.ws.service.repository._1_0.RepositoryServiceSoapPort;
import org.apache.axis.EngineConfiguration;
import org.apache.axis.configuration.FileProvider;
import org.oasis_open.docs.ns.cmis.ws._200908.NavigationServiceLocator;
import org.oasis_open.docs.ns.cmis.ws._200908.NavigationServicePort;
import org.oasis_open.docs.ns.cmis.ws._200908.ObjectServiceLocator;
import org.oasis_open.docs.ns.cmis.ws._200908.ObjectServicePort;
 
public class MainAuth {
 
	/**
	 * @param args
	 * @throws ServiceException 
	 * @throws MalformedURLException 
	 */
	public static void main(String[] args) throws Exception {
		String alfresco_base = "http://mioserveralfresco/alfresco";
		EngineConfiguration econfig = new FileProvider("client_deploy.wsdd");
		AuthenticationServiceLocator authenticationServiceLocator = new AuthenticationServiceLocator();
		AuthenticationServiceSoapPort auth = authenticationServiceLocator.getAuthenticationService(new URL(alfresco_base +
		"/api/AuthenticationService"));
		String password = "lamiapassword_che_ti_frega";
		AuthenticationResult sess = auth.startSession("pippo", password);
		String ticket = sess.getTicket();
		Staticone.setPass(ticket);
 
		AdministrationServiceLocator asl = new AdministrationServiceLocator(econfig);
		RepositoryServiceLocator repsl = new RepositoryServiceLocator(econfig);
		ContentServiceLocator contentSl = new ContentServiceLocator(econfig);
		ObjectServiceLocator osl = new ObjectServiceLocator(econfig);
		NavigationServiceLocator nsl = new NavigationServiceLocator(econfig);
 
		AdministrationServiceSoapPort adminService = asl.getAdministrationService(new URL
				( alfresco_base + "/api/AdministrationService"));
		RepositoryServiceSoapPort repoService = repsl.getRepositoryService(new URL
				( alfresco_base + "/api/RepositoryService"));
		ContentServiceSoapPort contentService = contentSl.getContentService(new URL
				( alfresco_base + "/api/ContentService") );
		ObjectServicePort objectService = osl.getObjectServicePort(new URL(alfresco_base + "/cmis/ObjectService"));
		NavigationServicePort navSerivce = nsl.getNavigationServicePort(new URL(alfresco_base + "/cmis/NavigationService"));
 
		UserDetails u = adminService.getUser("pippo");
		System.out.println(u.getUserName());;
		System.out.println( u.toString());
 
		Store[] stores = repoService.getStores();
		for (Store s : stores) {
			System.out.println("STORE " + s.getScheme() + " " + s.getAddress() );
			Predicate p = new Predicate();
			p.setStore(s);
			Content[] contenuti = contentService.read(p, " ");
			for (Content contenuto : contenuti) {
				System.out.println(">> url " + contenuto.getUrl());
				ContentFormat formato = contenuto.getFormat();
				if (formato != null) {
					System.out.println(">>> " + formato.getMimetype());
					System.out.println(">>> " + formato.getEncoding());
				}
				Reference n = contenuto.getNode();
				if (n != null)  {
					System.out.println(">>> uuid " + n.getUuid());
					System.out.println(">>> path " + n.getPath());
				}
				QueryResult qc = repoService.queryChildren(n);
				if (qc != null){
					ResultSet qrs = qc.getResultSet();
					if (qrs.getTotalRowCount() > 0 ) {
						ResultSetRow[] qrows = qrs.getRows();
						for (ResultSetRow qrow : qrows) {
							NamedValue[] qrcols = qrow.getColumns();
							ResultSetRowNode qnode = qrow.getNode();
							for (String sas : qnode.getAspects()  ) {
								System.out.println(">>> Aspect " + sas);
							}
							for (NamedValue qnv : qrcols) {
								System.out.println(">>> > nome colonna" + qnv.getName());
								if (qnv.getIsMultiValue()) {
									for (String qnvs : qnv.getValues()) {
										System.out.println(">>> > " + qnvs);
									}
								} else {
									System.out.println(">>> > " + qnv.getValue());
								}
							}
						}
					}
				}
 
			}
		}
 
		auth.endSession(ticket);
	}
 
}
 
java/alfresco/autenticazione_e_utilizzo_dei_webservice_di_alfresco_senza_la_sdk_remote.txt · Ultima modifica: 2013/02/19 11:18 da fcasadei
 
Recent changes RSS feed