Communardo Software GmbH, Kleiststraße 10 a, D-01129 Dresden
0800 1 255 255

Single Sign-On für Confluence

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:

  • Die Confluence-Anwendung ist über einen vorgeschaltenen Apache Webserver zu erreichen, der Servlet Container ist ein Apache Tomcat.
  • Der Webserver wird mit dem Modul mod_auth_kerb betrieben, welches die Authentikation gegen einen Kerberos-Dienst ermöglicht.
  • Der bei der Authentikation ermittelte Nutzername wird vom Apache über den AJP-Connector an den Tomcat weitergereicht. Dazu kann das Apache Modul mod_proxy_ajp verwendet werden.

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:

  • deploy der kompilierten Klasse in das WEB-INF Verzeichnis von Confluence (entweder als jar nach WEB-INF/lib oder unter WEB-INF/classes mit der dem Paket entsprechenden Unterordnerstruktur)
  • Austauschen des Authentikators durch Anpassung der Konfigurationsdatei WEB-INF/classes/seraph-config.xml:

    ...
    <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.

Related Posts

Pin It on Pinterest