Confluence unterstützt standardmäßig keine Authentikation über Single Sign-On Dienste. Im Folgenden soll kurz beschrieben werden wie dies dennoch erreicht werden kann.
Für jeden Seitenaufruf im Confluence-Wiki wird der aufrufende Nutzer benötigt. Um diesen zu ermitteln werden verschiedene Quellen abgefragt (Cookies, Session, …). Erst wenn auf diese Weise kein angemeldeter Nutzer festgestellt werden kann, wird die Login-Seite angezeigt. Der vollständige Ablauf der Authentikation kann im Confluence Development Hub nachgelesen werden. Diese Ermittlung des Nutzers erfolgt durch einen sog. Authentikator. Der muss nun so angepasst werden, dass er mit dem zu unterstützenden Single Sign-On Dienst zusammenarbeitet (also den über diesen Dienst angemeldeten Nutzer ermittelt). Dazu schreibt man am besten einen eigenen Authentikator der den Confluence Standardauthentikator beerbt und passt die entscheidenden Methoden an.
Die hier vorgestellte Lösung basiert darauf, dass der Name des bereits am Single Sign-On Dienst authentifizierten Nutzers dem Servlet Container von Confluence bereitgestellt wird. Damit kann er über das Request-Objekt ermittelt werden (HttpServletRequest.getRemoteUser()). Dies ist für jedes Single Sign-On System auf andere Weise einzurichten und verursacht auch den meisten Aufwand. Um beispielsweise eine Anbindung an einen Kerberos-Dienst zu realisieren ist folgendes Vorgehen denkbar:
Um nun die Authentikation gegen den weitergereichten Nutzernamen durchzuführen ist nur die Methode getUser() des Standardauthentikators (ConfluenceAuthenticator) zu überschreiben:
package my.auth.package;
public class MySSOAuthenticator extends ConfluenceAuthenticator{
public Principal getUser(HttpServletRequest request, HttpServletResponse response) {
Principal principal = null;
// check if the user is already logged in (cookies & co.)
principal = super.getUser(request, response);
if (principal == null) {
String remoteUserName = request.getRemoteUser();
if (remoteUserName != null && remoteUserName.trim() != "") {
// try to get the user's account using his name
principal = this.getUser(remoteUserName);
if (principal != null) {
// success, some additional code here (add user to session, ...)
} else {
// some error handling as user can't be acquired from request
}
}
}
return principal;
}
}
Nun muss nur noch der Standardauthentikator durch den neuen Authentikator ersetzt werden. Dies ist zum Glück mit wenig Aufwand machbar:
...
<authenticator class="my.auth.package.MySSOAuthenticator"/>
...
Nach einem Neustart von Confluence sollte nun der neue Authentikator verwendet und somit Single Sign-On unterstützt werden.
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 [...]