\subsection{JAAS}

Der Java\textsuperscript{TM} Authentication and Authorization Service
(\emph{JAAS}) ist, wie der Name andeutet ein Framework für die Authentisierung
von Usern sowie Authorierung von Handlungen. Im Gegensatz zu anderen Frameworks
ist seit 1.4 JAAS Teil der Java Standard Edition und daher auf jeder modernen
Java-Platform. Für ältere Systeme wie 1.3 war \emph{JAAS} noch optional. So
erklärt sich der geringere Funktionsumfang der eingebauten Lösung im Vergleich
zu 3rd-Party-Lösungen, die mehr auf die Anforderungen der einzelnen
Applikationen eingeben können.

\subsubsection{Authentifizierung}

Bei der Authentifizierung wird eine Instanz eines \texttt{LoginContext} gebildet,
welcher optional einen Callback-Handler enthält. In diesem Callback kann der
Programmierer angeben, wie er auf die entsprechenden Anfragen des
\texttt{LoginModule} reagieren will. Anfragen sind zum Beispiel
\texttt{NameCallback} oder \texttt{PasswordCallback}, miit dem das
\texttt{LoginModule} nach dem Namen resp. Passwort des Users fragen kann. Dadurch
wird die Authentisierung von der Präsentation entkoppelt. Die eigentliche
Authentifikation findet daraufhin in den \texttt{LoginModule}n statt. So wäre ein
\texttt{LoginModule} für LDAP denkbar, ebenso Anmeldung via SQL oder einfachen
Dateien. Java liegen LoginModule für JNDI, Keystores, Kerberos 5, Login an
Windows NT-Systemen sowie Login an Unix-Systemen bei. Weitere Module können
ebenfalls vom Programmierer geschrieben werden.

Die Konfiguration der \texttt{LoginModule} findet in einer speziellen, externen
Konfigurationsdatei statt, in der man festlegen kann welche \texttt{LoginModule}
notwendig sind, welche optional sowie ihnen etwaige debug-Parameter übergeben.
Diese Datei wird der JVM entweder beim Start als Parameter übergeben oder in
der \texttt{java.security}-Datei der JVM eingetragen.

Nach der Erstellung eines solchen \texttt{LoginContext} kann nun die Methode
\texttt{login()} aufgerufen werden, die im Fehlerfall eine
\texttt{LoginException} wirft.

\subsubsection{Authorisierung}

\emph{JAAS} nutzt für die Authentifizierung das Konzept von \emph{Subjects} und
\emph{Principals}. Nach dem Login kann man den \texttt{LoginContext} nach dem
eingeloggten \emph{Subject} befragen. Mit diesen Daten ist es möglich Code als
dieses eingeloggte \emph{Subject} auszuführen, indem man für die auszuführende
Handlung eine Klasse von \texttt{java.security.PrivilegedAction} ableitet. Die
API ist ähnlich zu der Threading-API, so existiert eine \texttt{run}-Methode die
ausgeführt wird wenn man die Ausführung der Handlung mit
\texttt{Subject.doAsPrivileged(subjectInstanz, actionInstanz, null)} einleitet.
Zudem können dem \emph{Subject} beim Login sogenannte \emph{Principals}
zugeordnet werden, welche Rollen entsprechen.

In der \texttt{run()}-Methode kann man nun beliebigen Code schreiben, wobei
während der Ausführung in einer Policy-Datei geprüft wird, ob der Code
ausgeführt werden darf. Die Policy-Datei wird, ähnlich wie die
LoginModule-Konfiguration ebenfalls der JVM übergeben. In ihr können
Berechtigungen feingranular vergeben werden, je nachdem aus welcher Codebase
(JAR) der auszuführende Code stammt, welcher User (\emph{Subject}) oder Rolle
(\emph{Principal}) den Code ausführen will, welche Funktionen aufgerufen werden
dürfen. Allerdings müssen dazu die aufzurufenden Funktionen entsprechende
Permissions bereitstellen und prüfen.  Bei den Klassen des JVMs ist dies der
Fall, bei eigenen Klassen muss man selbst Permissions definieren.

\subsubsection{Einschätzung}

Obwohl \emph{JAAS} Teil der Java-Umgebung ist, ist es für die Verwendung in einem
Clinical-Trial-System nicht optimal:

\begin{itemize}
  \item Die Konfigurationsformate sind ad-hoc und nicht sonderlich intuitiv.
    Gerade bei längeren Policies wird das schreiben von feingranularen Regeln
    sehr mühsam, zudem auch noch separat Policies in Java implementiert werden
    müssen.
  \item Es ist keine Drop-In-Lösung, erfordert eine Reihe von Konfigurationsdaten
    und Anpassung von JVM-Parametern. Wenn zwei Libraries JAAS gleichzeitig
    verwenden sollen kommt es zu Problemen welche Konfigurationsdateien genutzt
    werden sollen.
  \item Es ist stark auf Desktop-Applikationen ausgelegt, so bietet es zwar
    flexible Regeln zur Kombination von verschiedenen Codebases, dieses ist
    aber bei Web-Applikationen völlig unnötig
  \item Die LoginModule sind nicht annähernd so umfassend wie bei anderen
    Frameworks, es würde wohl notwendig sein eigene LoginModule für JAAS zu
    schreiben
  \item Es bietet keinerlei Schutzmechanismen vor üblichen Web-Problemen
    wie Cross-Site-Request-Forgery, Cross-Site-Scripting oder Injections,
    weil sich JAAS auf einer wesentlich tieferen Abstraktionsschicht befindet.
    Es wäre nötig, das alles selbst zu Implementieren oder auf ein anderes
    Framework zurückzugreifen, womit dann der Sinn JAAS überhaupt einzusetzen
    fraglich ist
  \item Die Dokumentation ist eher minimalistisch.
\end{itemize}
