Alfresco in UCS

Dieser Artikel wird im Univention Wiki weiter gepflegt: http://wiki.univention.de/

Alfresco ist ein CMS, welches auf Apache Tomcat basiert. Es sollte ein System mit mindestens 800 MB Arbeitsspeicher für Alfresco verwendet werden. Da Tomcat JAVA benötigt, muss zunächst ein JRE installiert werden. Die geschieht mit folgendem Befehl:

apt-get install sun-java5-jdk

Anschließend wird ein Verzeichnis für Alfresco angelegt:

mkir /opt/alfresco/

In dieses Verzeichnis wird Alfresco heruntergeladen und entpackt:

cd /opt/alfresco/
wget
http://mesh.dl.sourceforge.net/sourceforge/alfresco/alfresco-community-tomcat-2.1.0.tar.gz
tar -xvzf alfresco-community-tomcat-2.1.0.tar.gz

Im Weiteren wird ein Startskript für Alfresco erstellt (/etc/init.d/alfresco) mit folgendem Inhalt:

#!/bin/sh
#Pfad zum JRE evtl. anpassen!

cd /opt/alfresco/

export JRE_HOME=/usr/lib/jvm/java-1.5.0-sun-1.5.0.12/jre/

/opt/alfresco/alfresco.sh start

Das skript muss noch mittels

chmod +x /etc/init.d/alfresco

ausführbar gemacht werden und dann mittels

update-rc.d alfresco defaults

Die entsprechenden Links gesetzt werden, damit Alfresco gleich beim Start des Systems mitgestartet wird.

Um Alfresco sofort und ohne Neustart des Servers zu starten muss das Startskript manuell ausgeführt werden:

/etc/init.d/alfresco start

Nach dem Ausführen des Skriptes kann ein Moment (etwa 2 min) vergehen, bis der Tomcat-Server fertig gestarted und einsatzbereit ist. Danach lässt sich Alfresco unter ttp://:8080/alfresco/ aufrufen und fragt nach Benutzername und Passwort. Da die Authentifizierung über LDAP noch nicht eingerichtet ist, kann man sich testweise nur mit den Standardeinstellungen von Alfresco anmelden (Benutzer: admin Passwort: admin).

Einrichtung von LDAP mit Alfresco

Um eine Authentifizierung über die Daten eines LDAP-Servers durchzuführen, wird der interne Authentifizierungsmachnismuss von Afresco durch JAAS (Java Authentication and Authorization Service) ersetzt. Um Alfresco zu Signaliesieren, dass es weitere Konfigurationsdateien berücksichtigen muss, muss die Datei /opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/extension/custom-services-context.xml
mit folgendem Inhalt erstellt werden:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN'
'http://www.springframework.org/dtd/spring-beans.dtd'>

<beans>

        <!-- import further configurations -->
        <import
resource="file:/opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/ldap.xml"
/>

</beans>

Die Eigendliche Konfigurationsdatei ist dann die Datei
/opt/alfresco/tomcat/webapps/alfresco/WEB-INF/classes/alfresco/ldap.xml die mit
folgendem Inhalt erstellt werden muss, wobei jeweils bei den Kommentaren die
Datei durch die zutreffenden Wert ergänzt werden muss:

<?xml version='1.0' encoding='UTF-8'?>
<!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN'
'http://www.springframework.org/dtd/spring-beans.dtd'>

<!-- Die zur Installation von Alfresco mit UCS noetigen Einstellungen sind im
Folgenden dokumentiert-->

<beans>

    <bean name="authenticationDao"
class="org.alfresco.repo.security.authentication.DefaultMutableAuthenticationDao"
>
        <property name="allowDeleteUser">
            <value>true</value>
        </property>
    </bean> 


    <bean id="authenticationComponent"
class="org.alfresco.repo.security.authentication.ldap.LDAPAuthenticationComponentImpl">
        <property name="LDAPInitialDirContextFactory">
            <ref bean="ldapInitialDirContextFactory"/>
        </property>
        <property name="userNameFormat">

<!-- Aendern Sie zur Installation in UCS die Werte bei dc. Hier angenommen ist
der Domaenenname 'ucs.test' -->

            <value>uid=%s,cn=users,dc=ucs,dc=test</value>
        </property>
    </bean>

    <bean id="ldapInitialDirContextFactory"
class="org.alfresco.repo.security.authentication.ldap.LDAPInitialDirContextFactoryImpl">
        <property name="initialDirContextEnvironment">
            <map>
                <entry key="java.naming.factory.initial">
                    <value>com.sun.jndi.ldap.LdapCtxFactory</value>
                </entry>
                <entry key="java.naming.provider.url">
<!-- Tragen Sie in der Nachfolgenden Zeile die IP-Adresse Ihres LDAP-Servers
ein!-->
                        <value>ldap://10.200.15.150:389</value>
                </entry>

                <entry key="java.naming.security.authentication">
                    <value>simple</value>
                </entry>

            </map>
        </property>
    </bean>

<!--Die Nachfolgenden Daten werden benoetigt, um erweiterte Benutzerspezifische
Informationen, wie Name und E-Mailadresse des Benutzers aus dem
LDAP-Verzeichnis zu holen -->
<bean id="ldapPeopleExportSource"
class="org.alfresco.repo.security.authentication.ldap.LDAPPersonExportSource">

        <property name="personQuery">
            <value>(objectclass=inetOrgPerson)</value>
        </property>

<!-- Aendern Sie hier die Werte bei dc auf die Werte Ihres Servers. angenommen
ist hier ucs.test (s.o.)-->
        <property name="searchBase">
            <value>dc=ucs,dc=test</value>
        </property>

        <property name="userIdAttributeName">
            <value>uid</value>
        </property>

        <property name="LDAPInitialDirContextFactory">
            <ref bean="ldapInitialDirContextFactory"/>
        </property>
        <property name="personService">
            <ref bean="personService"></ref>
        </property>
        <property name="namespaceService">
            <ref bean="namespaceService"/>
        </property>

<!-- Im folgenden werden die Attribute des LDAP-Verzeichnis auf die Daten von
Alfresco abgebildet-->
        <property name="attributeMapping">
            <map>
                <entry key="cm:userName">
                    <value>uid</value>
                </entry>
                <entry key="cm:firstName">
                    <value>givenName</value>
                </entry>
                <entry key="cm:lastName">
                    <value>sn</value>
                </entry>
                <entry key="cm:email">
                    <value>mailPrimaryAddress</value>
                </entry>
                <entry key="cm:organizationId">
                    <value>o</value>
                </entry>
                <entry key="cm:homeFolderProvider">
                    <null/>
                </entry>
            </map>
        </property>

        <property name="attributeDefaults">
            <map>
                <entry key="cm:homeFolderProvider">
                    <value>personalHomeFolderProvider</value>
                </entry>
            </map>
        </property>
    </bean>

<!-- Auslesen der Gruppeninformationen fuer Alfresco -->

    <bean id="ldapGroupExportSource"
class="org.alfresco.repo.security.authentication.ldap.LDAPGroupExportSource">

        <property name="groupQuery">
            <value>(objectclass=groupOfNames)</value>
        </property>

<!-- Die unten aufgefuehrten Werte wieder durch die auf die Domaene
zutreffenden Werte Aendern hier im Beispiel ucs.test-->
        <property name="searchBase">
            <value>dc=ucs,dc=test</value>
        </property>

        <property name="userIdAttributeName">
            <value>uid</value>
        </property>

        <property name="groupIdAttributeName">
            <value>cn</value>
        </property>

        <property name="groupType">
            <value>groupOfNames</value>
        </property>

        <property name="personType">
            <value>inetOrgPerson</value>
        </property>
        <property name="LDAPInitialDirContextFactory">
            <ref bean="ldapInitialDirContextFactory"/>
        </property>
        <property name="namespaceService">
            <ref bean="namespaceService"/>
        </property>

        <property name="memberAttribute">
            <value>member</value>
        </property>

        <property name="authorityDAO">
            <ref bean="authorityDAO"/>
        </property>
    </bean>

    <bean id="ldapPeopleTrigger" class="org.alfresco.util.TriggerBean">
        <property name="jobDetail">
            <bean id="ldapPeopleJobDetail"
class="org.springframework.scheduling.quartz.JobDetailBean">
                <property name="jobClass">
                    <value>org.alfresco.repo.importer.ImporterJob</value>
                </property>
                <property name="jobDataAsMap">
                    <map>
                        <entry key="bean">
                            <ref bean="ldapPeopleImport"/>
                        </entry>
                    </map>
                </property>
            </bean>
        </property>
<!-- Der folgende Parameter gibt an, wieviel Millisekunden nach dem Start von
Alfresco das
     erste Mal erweiterte Benutzerdaten von Alfresco mit LDAP abgegeglichen
wird (hier: 5 min)-->
        <property name="startDelay">
            <value>300000</value>
        </property>
<!-- Nach wievielen Millisekunden soll der Abgleich der erweiterten Daten
erneut erfolgen? (hier: nach einer Stunde) -->
        <property name="repeatInterval">
            <value>3600000</value>
        </property>
<!-- Werden die naechsten drei Zeilen auskommentiert, wird kein Abgleich der
erweiterten Benutzerdaten mehr durchgefuehrt-->
        <property name="scheduler">
            <ref bean="schedulerFactory" />
        </property>

    </bean>

    <bean id="ldapGroupTrigger" class="org.alfresco.util.TriggerBean">
        <property name="jobDetail">
            <bean id="ldapGroupJobDetail"
class="org.springframework.scheduling.quartz.JobDetailBean">
                <property name="jobClass">
                    <value>org.alfresco.repo.importer.ImporterJob</value>
                </property>
                <property name="jobDataAsMap">
                    <map>
                        <entry key="bean">
                            <ref bean="ldapGroupImport"/>
                        </entry>
                    </map>
                </property>
            </bean>
        </property>
<!-- Der folgende Parameter gibt an, wieviel Millisekunden nach dem Start von
Alfresco das
     erste Mal erweiterten Gruppendaten von Alfresco mit LDAP abgegeglichen
wird (hier: 5 min)-->
        <property name="startDelay">
            <value>300000</value>
        </property>
<!-- Nach wievielen Millisekunden soll der Abgleich der erweiterten Daten
erneut erfolgen? (hier: nach einer Stunde) -->
        <property name="repeatInterval">
            <value>3600000</value>
        </property>
<!-- Werden die naechsten drei Zeilen auskommentiert, wird kein Abgleich der
erweiterten Gruppendaten mehr durchgefuehrt-->
        <property name="scheduler">
            <ref bean="schedulerFactory" />
        </property>

    </bean>


    <bean id="ldapPeopleImport"
class="org.alfresco.repo.importer.ExportSourceImporter">
        <property name="importerService">
            <ref bean="importerComponentWithBehaviour"/>
        </property>
        <property name="transactionService">
            <ref bean="transactionComponent"/>
        </property>
        <property name="authenticationComponent">
            <ref bean="authenticationComponent"/>
        </property>
        <property name="exportSource">
            <ref bean="ldapPeopleExportSource"/>
        </property>

        <property name="storeRef">
            <value>${spaces.store}</value>
        </property>

        <property name="path">
           
<value>/${system.system_container.childname}/${system.people_container.childname}</value>
        </property>

        <property name="clearAllChildren">
            <value>false</value>
        </property>
        <property name="nodeService">
            <ref bean="nodeService"/>
        </property>
        <property name="searchService">
            <ref bean="searchService"/>
        </property>
        <property name="namespacePrefixResolver">
            <ref bean="namespaceService"/>
        </property>


        <property name="caches">
            <set>
                <ref bean="permissionsAccessCache"/>
            </set>
        </property>
    </bean>

    <bean id="ldapGroupImport"
class="org.alfresco.repo.importer.ExportSourceImporter">
        <property name="importerService">
            <ref bean="importerComponentWithBehaviour"/>
        </property>
        <property name="transactionService">
            <ref bean="transactionComponent"/>
        </property>
        <property name="authenticationComponent">
            <ref bean="authenticationComponent"/>
        </property>
        <property name="exportSource">
            <ref bean="ldapGroupExportSource"/>
        </property>

        <property name="storeRef">
            <value>${alfresco_user_store.store}</value>
        </property>

        <property name="path">
           
<value>/${alfresco_user_store.system_container.childname}/${alfresco_user_store.authorities_container.childname}</value>
        </property>

        <property name="clearAllChildren">
            <value>true</value>
        </property>
        <property name="nodeService">
            <ref bean="nodeService"/>
        </property>
        <property name="searchService">
            <ref bean="searchService"/>
        </property>
        <property name="namespacePrefixResolver">
            <ref bean="namespaceService"/>
        </property>

        <property name="caches">
            <set>
                <ref bean="userToAuthorityCache"/>
                <ref bean="permissionsAccessCache"/>
            </set>
        </property>

    </bean>

</beans>

Sind alle Dateien erstellt, muss alfresco neu gestartet werden (in
/opt/alfresco):

export JRE_HOME=/usr/lib/jvm/java-1.5.0-sun-1.5.0.12/jre/
./alfresco.sh stop
./alfresco.sh start

Nachdem Alfresco neu gestartet ist, können sich LDAP Benutzer anmelden.

Weitere Informationen finden sich unter:
wiki.alfresco.com/wiki/Enterpris … figuration

Sowie eine Beispiel-Konfigurationsdatei unter:
/opt/alfresco/tomcat/shared/classes/alfresco/extension/ldap-authentication-context.xml.sample

Mastodon