OpenBenno ist eine unter GPL lizenzierte E-Mail Archivierungslösung. Damit ist es möglich, die gesetzlichen Anforderungen zur Archivierung elektronischer Kommunikation umzusetzen. Soll diese Software im Unternehmen eingesetzt werden, ist zumeist eine Anbindung an ein vorhandenes Nutzerrepository via LDAP notwendig. Dieser Artikel beschreibt die notwendige Konfiguration der Anbindung an CAS und das Active Directory. Die zusätzlich notwendige Library, deren Sourcen und eine Beispielkonfiguration können am Ende des Artikels heruntergeladen werden.
Zur Authentifikation und Autorisation benutzt OpenBenno das Spring Security (ehemals Acegi) Framework. Dieses ermöglicht die Einbindung der Anwendung in eine Vielzahl von Wirkumgebungen. Die Authentifikation sollte im konkreten Fall über die Single-Sign-On-Lösung CAS erfolgen. Die Auflösung der Nutzerberechtigungen wird über die LDAP-Schnittstellt des Active Directorys erfolgen.
Die initiale Einbindung des CAS-Workflows wird von einem EntryPoint ermöglicht, der eine Weiterleitung zur CAS-Login-Seite vornimmt:
<http entry-point-ref="casProcessingFilterEntryPoint"> <intercept-url pattern="/login.html*" filters="none"/> <intercept-url pattern="/images/**" filters="none"/> <!-- adjust this role for your needs. "User" is a group, in that (in this case) --> <!-- everybody is a member, who should have access to the mail archive. --> <intercept-url pattern="/**" access="ROLE_USER"/> <form-login login-page='/login.html'/> <logout invalidate-session="true" logout-success-url="/login.html" /> </http> <beans:bean id="casProcessingFilterEntryPoint" class="org.springframework.security.ui.cas.CasProcessingFilterEntryPoint"> <beans:property name="loginUrl" value="https://www.mycompany.de/cas/login"/> <beans:property name="serviceProperties" ref="serviceProperties"/> </beans:bean> <beans:bean id="serviceProperties" class="org.springframework.security.ui.cas.ServiceProperties"> <beans:property name="service" value="http://www.mycompany.de/bennosearch/j_spring_cas_security_check"/> <beans:property name="sendRenew" value="false"/> </beans:bean>
Die Rollendefinition ROLE_USER muss dabei so angepasst werden, dass dort eine Gruppe referenziert wird, der alle Nutzer angehören, die Zugriff auf das Mailarchiv erhalten sollen. An der Bean casProcessingFilterEntryPoint muss dabei die Login-URL des CAS definiert werden. In den serviceProperties muss die URL definiert werden, auf die das CAS bei erfolgreichem Login weiterleitet. Wichtig ist dabei die Angabe der speziellen URL (/j_spring_cas_security_check), auf welche ein spezieller CAS-Filter angesetzt wird:
<authentication-manager alias="authenticationManagerAlias"/> <beans:bean id="casProcessingFilter" class="org.springframework.security.ui.cas.CasProcessingFilter"> <custom-filter after="CAS_PROCESSING_FILTER"/> <beans:property name="authenticationManager" ref="authenticationManagerAlias"/> <beans:property name="defaultTargetUrl" value="/"/> <beans:property name="filterProcessesUrl" value="/j_spring_cas_security_check"/> </beans:bean>
Die Validierung des CAS-Tickets wird später von einem custom-authentication-provider durchgeführt. Dieser benötigt die Basis-URL des CAS:
<beans:bean id="casAuthenticationProvider" class="org.springframework.security.providers.cas.CasAuthenticationProvider">
<custom-authentication-provider/>
<beans:property name="userDetailsService" ref="userDetailsService"/>
<beans:property name="serviceProperties" ref="serviceProperties"/>
<beans:property name="ticketValidator">
<beans:bean class="org.jasig.cas.client.validation.Cas20ServiceTicketValidator">
<beans:constructor-arg index="0" value="https://www.mycompany.de/cas/"/>
</beans:bean>
</beans:property>
<beans:property name="key" value="ticket"/>
</beans:bean>
Bei erfolgreicher Authentifizierung werden über den referenzierten userDetailsService die Rollen des Nutzers nachgeladen, welche später entscheiden, ob das Mailarchiv überhaupt zugänglich ist, und welche E-Mail-Adressen durchsucht werden können. Dabei wird auf das Active Directory zugegriffen.
<beans:bean id="contextSource" class="org.springframework.security.ldap.DefaultSpringSecurityContextSource">
<beans:constructor-arg value="ldap://ldap.mycompany.de:3268/dc=mycompany,dc=de"/>
<beans:property name="userDn" value="cn=publicLogin,cn=Users"/>
<beans:property name="password" value="publicLoginPassword"/>
</beans:bean>
<beans:bean id="userDetailsService" class="org.springframework.security.userdetails.ldap.LdapUserDetailsService">
<beans:constructor-arg index="0" ref="userSearch"/>
<beans:constructor-arg index="1" ref="authoritiesPopulator"/>
</beans:bean>
<beans:bean id="userSearch" class="org.springframework.security.ldap.search.FilterBasedLdapUserSearch">
<beans:constructor-arg index="0" value="CN=Users"/>
<beans:constructor-arg index="1" value="(&(sAMAccountName={0})(objectClass=user))"/>
<beans:constructor-arg index="2" ref="contextSource"/>
</beans:bean>
Die Bean contextSource definiert die URL des LDAPs und den zu verwendenden Basispfad. Weiterhin müssen ein öffentlicher Nutzer und Passwort für einen erfolgreichen Bind angegeben werden. Die Bean userSearch definiert einen Filter zum Auffinden des eingeloggten Nutzers, wobei {0} ein Platzhalter für das eingegebene Login ist. Für den referenzierten authoritiesPopulator muss jedoch eine spezielle Komponente für OpenBenno verwendet werden:
<beans:bean id="authoritiesPopulator" class="de.communardo.openbenno.OpenBennoLdapAuthoritiesPopulator">
<beans:constructor-arg ref="contextSource"/>
<beans:constructor-arg value=""/>
<beans:property name="groupRoleAttribute" value="cn"/>
<beans:property name="groupSearchFilter" value="(&(member={0})(objectClass=group))"/>
<beans:property name="rolePrefix" value="ROLE_"/>
<beans:property name="searchSubtree" value="true"/>
<beans:property name="convertToUpperCase" value="false"/>
<beans:property name="mailRoleAttribute" value="mail"/>
</beans:bean>
Dieser authoritiesPopulator ist eine Ableitung vom standardmäßigen DefaultLdapAuthoritiesPopulator, der damit um eine Funktion erweitert wurde. Es wird nicht nur die Menge an zugewiesenen Nutzergruppen (aus dem Active Directory) in Rollenbezeichnungen für Spring Security überführt, sondern zusätzlich die E-Mail-Adresse des Nutzers als spezielle Rolle mit dem Präfix ROLE_MAIL_ bereitgestellt.
Im konkreten Fall bezeichnet das Attribut mail des authentifizierten Nutzers die jeweilige E-Mail-Adresse. Über die Property mailRoleAttribute kann dieser Wert angepasst werden. Optional kann über die Property roleMailPrefix der Präfix (standardmäßig ROLE_MAIL_) angepasst werden. Für die aktuelle Version von OpenBenno ist dies jedoch nicht notwendig.
Der OpenBennoLdapAuthoritiesPopulator überschreibt die getAdditionalRoles-Methode und entnimmt lediglich das Mail-Attribut aus dem LDAP-Nutzer und stellt diese, zusammen mit dem Präfix, als neue Authority bereit:
protected Set getAdditionalRoles(DirContextOperations user, String username) {
String mailAddress = user.getStringAttribute(mailRoleAttribute);
String role = roleMailPrefix + mailAddress.toLowerCase();
Set result = new HashSet();
result.add(new GrantedAuthorityImpl(role));
return result;
}
Die gesamte Klasse kann im Quellcode und als gepaktes JAR heruntergeladen werden.
Bereits im ersten Codeabschnitt wurde das Logout-Verhalten definiert:
<logout invalidate-session="true" logout-success-url="/login.html" />
Damit wird erreicht, dass nach einem Klick auf den Logout-Button zur Login-Seite gesprungen und die Session invalidiert wird. Um sich auf der dann gezeigten Login-Seite erneut einloggen zu können, muss LDAP noch für den direkten Login konfiguriert werden. Dies ist durch die Registrierung eines custom-authentication-providers möglich:
<beans:bean id="ldapProvider" class="org.springframework.security.providers.ldap.LdapAuthenticationProvider"> <custom-authentication-provider/> <beans:constructor-arg ref="ldapBindAuthenticator" /> <beans:constructor-arg ref="authoritiesPopulator"/> </beans:bean> <beans:bean id="ldapBindAuthenticator" class="org.springframework.security.providers.ldap.authenticator.BindAuthenticator"> <beans:constructor-arg ref="contextSource"/> <beans:property name="userSearch" ref="userSearch" /> </beans:bean>
Mithilfe der beschriebenen Konfigurationsschritte ist die Anbindung von OpenBenno an CAS und LDAP (z.B. Active Directory) möglich. Um Ihr OpenBenno entsprechend zu konfigurieren, folgen Sie bitte diesen Schritten:
Releaseparty at Atlassian? Confluence 3.2 BETA and 3.1.2 with soms bugfixes were released yesterday. [...]
Tino Schmidt's Vortrag zu Enterprise Mashups auf der webciety, 4.3 Remix the Web http://bit.ly/d26rtA [...]
neuer Blogpost: February Cumulative Update (2010) http://bit.ly/cwxZGE [...]
Webinar am 16.03.: „Communote Enterprise Microblogging - Funktionen und Einsatzbereiche im Unternehmen“ http://bit.ly/96eexF [...]