One of the new features added to Alfresco Enterprise 3.2r is the ability to turn Web Scripts into standalone portlets that run on Liferay or other portals and include support for Single Sign-On (SSO) and generating portal-friendly URLs.
At the moment, the way to get this working requires deploying share.war into the portal environment even though the Alfresco Share app itself is not going to work as a portlet due to browser-side JavaScript/AJAX issues. A colleague of mine is reportedly working on creating a smaller WAR but the mechanism to make all this work is surprisingly simple and is what I’d like to illustrate now.
I assume you’ve installed the Alfresco and Liferay Tomcat bundles into separate directories. I’ll refer to these as <ALFRESCO_HOME> and <LIFERAY_HOME>
Step 1. Configuring Liferay’s Tomcat Server to resolve port conflicts by editing <LIFERAY_HOME>/<tomcat>/conf/server.xml:
Change all the port numbers to avoid conflicts with the Alfresco’s Tomcat server, here are the changes I made:
... <Server port="8105" shutdown="SHUTDOWN"> ...
<Connector port="9090" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="9443" URIEncoding="UTF-8" />
... <Connector port="8109" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" /> ...
Step 2. Next, edit <LIFERAY_HOME>/<tomcat>/conf/catalina.properties and locate the “shared.loader” entry and replace it with this:
shared.loader=${catalina.base}/shared/classes,${catalina.base}/shared/lib/*.jar
Step 3. Edit <ALFRESCO_HOME>/tomcat/shared/classes/alfresco-global.properties and add the following lines to the end of the file:
authentication.chain=alfrescoNtlm1:alfrescoNtlm,external1:external external.authentication.proxyUserName=
NOTE: Yes, the value for proxyUserName needs to be blank.
Step 4. Copy <ALFRESCO_HOME>/tomcat/webapps/share.war to <LIFERAY_HOME>/deploy
Step 5. Copy the entire <ALFRESCO_HOME>/tomcat/shared directory to <LIFERAY_HOME>/<tomcat>/
NOTE: Technically, we only need the shared/classes/alfresco/web-extension directory, but copying the whole shared directory is a convenient alternative.
Step 6. Rename <LIFERAY_HOME>/<tomcat>/shared/classes/alfresco/web-extension/webscript-framework-config-custom.xml.sample to webscript-framework-config-custom.xml and edit the file to uncomment the second config block to enable remote authenticator. The comments are on lines 44 and 73. The result should look like this:
... <!-- sessions" feature of your load balancer must be used --> <config evaluator="string-compare" condition="Remote"> <remote> <!-- SSL client certificate + trusted CAs. Optionally used to authenticate share to an external SSO system such as CAS --> <keystore> ... </keystore> <connector> ... </connector> <endpoint> <id>alfresco</id> <name>Alfresco - user access</name> <description>Access to Alfresco Repository WebScripts that require user authentication</description> <connector-id>alfrescoCookie</connector-id> <endpoint-url>http://localhost:8080/alfresco/wcs</endpoint-url> <identity>user</identity> <external-auth>true</external-auth> </endpoint> </remote> </config>
NOTE: If you’re running Alfresco’s Tomcat server on a different host or port, please change the corresponding endpoint.
Step 7. Startup Alfresco, then follow up with starting Liferay.
Step 8. Once Alfresco and Liferay are started, add and try out the basic CMIS Repo Browser portlet. It should appear under the “Alfresco” category.
This integration makes use of an external authenticator that will automatically create an Alfresco user account whenever a new Liferay user accesses an Alfresco portlet.
To create your own custom portlet, I recommend you look at the CMIS Repo code under in the share.war file under WEB-INF/classes/alfresco/webscripts/org/alfresco/test/cmisrepo.* and cmisfolder.*.
In short, you’ll need to create a Web Script which can be placed inside the share.war file under WEB-INF/classes/alfresco/webscripts or in <LIFERAY_HOME>/<tomcat>/shared/classes/alfresco/web-extension/webscripts (create the directory if it doesn’t already exist.
You’ll also need to edit the portlet.xml file in the share.war/WEB-INF directory to add a new entry for your portlet using the Alfresco “ProxyPortlet” as the portlet class.
<portlet> <description>CMIS Folder Browser</description> <portlet-name>CMISFolder</portlet-name> <portlet-class>org.alfresco.web.portlet.ProxyPortlet</portlet-class> <init-param> <name>scriptUrl</name> <value>/share/service/sample/cmis/repo</value> </init-param> <supports> <mime-type>text/html</mime-type> <portlet-mode>VIEW</portlet-mode> </supports> <portlet-info> <title>CMIS Folder Browser</title> <short-title>CMIS Folder</short-title> </portlet-info> </portlet>
Finally add your portlet to the liferay-display.xml and liferay-portlet.xml files.
To make sure that your URLs are correctly generated, please use the “scripturl()” function in your Freemarker templates to wrap them:
<a href="${scripturl(url.serviceContext + "/sample/cmis/repo", false)}">CMIS Repository</a>
This new mechanism is the first significant step in better tying together Alfresco with portal platforms and expect new developments with future releases.













