Massenhinzufügen von Nutzern zu Kimai (1.1.0)

Kimai [1] ist ein web-basiertes Tool um Arbeitszeiten zu erfassen, sei es um Arbeitszeiten von Mitarbeitern eines Betriebs bzw. Projekts zu erfassen oder um die eigentliche Arbeitsbelastung von Studierenden in Lehrveranstaltungen zu erfassen. Kimai kann Projekte, Tätigkeiten, Kunden verwalten, Rechnungen (wenn ein Stundenlohn eingetragen wurde) drucken, die Daten exportieren, etc. Kimai ist ein sehr mächtiges Tool. Neben dem hinzufügen mit bekannten Start- und Enddatum / Zeit kann auch ein tracken angeschaltet werden, d.h. Kimai nimmt die Zeit zwischen zwei Knopfdrücken auf.

Hier geht es aber darum das Tool zur Lehrevaluation an einer Universität zu verwenden. Genauer soll es darum gehen die Studierenden zu befragen, wie viel Zeit sie für eine bestimmte Lehrveranstaltung genau benötigen. Dabei ist es wichtig, dass die Studierenden eine intuitive Oberfläche haben und immer im Semester an ihre Daten kommen. Leider ist Kimai nicht an allen Stellen intuitiv, ich hoffe aber, dass die Informatik-Studierenden trotzdem mit dem Tool klar kommen.

Leider kann Kimai auch nicht mehrere Nutzer auf einmal hinzufügen, was aber für den Anwendungszweck zwingend erforderlich ist, weil die Studierenden natürlich pseudonymisiert erfasst werden sollen. Nach einiges an Zeit habe ich folgende Entdeckungen gemacht:

  • includes/autoconf.php enthält neben Passworten für die Datenbank auch das Passwort-Salt für die Nutzer von Kimai
  • includes/func.php enthält die Funktion, die die Passwort-Hashes erzeugt (md5(\$salt.\$password.\$salt));

Das können wir uns zu Nutze machen, indem wir die Passwort-Hashes selbst erzeugen, Nutzernamen festlegen und in die Datenbank eintragen. Dabei gibt es zwei spannende Datenbanktabellen (ich verwende die Tabellen mit dem Prefix 'kimai').

  • kimai_users enthält die Nutzer, deren Passwort, Zustand, globale Rolle
  • kimai_groups_users enthält die Zuordnung der Users zu den Gruppen und Rollen innerhalb der Gruppe

Zur Erklärung: in Kimai kann ein Nutzer eine globale Rolle haben, bspw. Nutzer, aber im Kontext eines Projekts (Gruppe) eine höher gestellte Rolle einnehmen bspw. Groupleader. Was die Rolle alles darf, ist dann im Tool festzulegen und wird auch in der Datenbank (allerdings einer anderen Tabelle) gespeichert.

Die Nutzer erhalten einen Namen, eine ID (hochzählen reicht da, obwohl Kimai beim Erstellen eine zufällige ID festlegt) und ein Passwort Hash. Weiter werden in kimai_users Einträge benötigt für die globale Gruppierung. Für Nutzer des Systems genügt es, wenn Sie die "Users"-Rolle haben, d.h. keine Nutzer hinzufügen oder verändern können. Auch sollte datenschutzrechtlich geklärt sein, dass kein Nutzer die Eintragungen eines anderen Nutzers sehen darf. Der Wert 2 stellt (jedenfalls in der Standardsituation) die globale Rolle "User" dar.

Die Gruppenzuordnung bedarf einer etwas genaueren Betrachtung. Zunächst legen wir im Tool eine Gruppe an, dann einen Kunden, ein Projekt und Tätigkeiten in dem Projekt. Das Projekt können wir dann der neuen Gruppe zuordnen, sodass alle Mitglieder der Gruppe in dieses Projekt Arbeit stecken können. In der Tabelle kimai_groups_users  wird dann die Nutzer-ID, der Gruppenname und die Rolle innerhalb der Gruppe (siehe dazu die gruppenspezifischen Rollen) eingetragen.

Folgendes Skript erzeugt 50 Nutzer, jeweils mit einem Passwort (hier entfernt), erzeugt die SQL-Statements und eine tex-Datei, die alle Nutzerdaten enthält. Zu letzterem wird eine Art Wrapper benötigt, die einen sinnvollen Kontext bietet, bspw. eine Art Fragebogen oder Code, der die Zugangsdaten sinnvoll formatiert, damit ein Ausschneiden kleinerer Zettel für jeden Teilnehmer möglich wird.

<?php
$rootname="kimai_nutzer_";
$insert="";
$group="";

$tex="";
$fmt="";
$fmt="\textbf{Zugangsdaten}\\Nutzername: %s\\Passwort: $s\\URL: kimai.org"

$salt="ein Salt";
for ($i=1; $i<=50; $i++)
{
    if ($i<10)
        $usrname = $rootname."0".$i;
    else
        $usrname = $rootname.$i;

    $passwd="";
    /**
     * Passowrt Generierung hier!
     **/

    $hash = md5 ( $salt.$passwd.$salt );

    if ($i>1) {
        $insert.=",";
        $group .=",";
    }
    $insert .= "($i, '$usrname', NULL, 0, 1, '',  '$hash', NULL, 0,0, '0', 1, 1, 0, 0, 0, NULL, 2)";
    $group .= "(2, $i, 2)";

    $tex.=sprintf($fmt, str_replace("_", "\_", $usrname), $passwd);
}

$q = fopen("query.sql", "w+");
$g = fopen("group.sql", "w+");
$query="INSERT INTO kimai_users (userId, name, alias, trash, active, mail, 
                    password, passwordResetHash, ban, banTIme, secure, 
                    lastProject, lastActivity, lastRecord, timeframeBegin, 
                    timeframeEnd, apikey, globalRoleId) VALUES ".$insert;
$groupquery="INSERT INTO kimai_groups_users (groupID, userID, membershipRoleID) VALUES $group";

fwrite ($q, $query);
fclose($q);
fwrite ($g, $groupquery);
fclose($g);

echo $tex;
?>

Die Dateien query.sql und group.sql werden dann entweder über Tools wie phpMyAdmin [2] importiert oder über das mysql-Kommdozeilenwerkzeug nach dem Auswählen der richtigen Datenbank (USE \<datenbankname>) über das Kommando source geladen.

Hinweise: Wenn Nutzer "automatisch" hinzugefügt werden solltet ihr darauf achten, dass keinesfalls Nutzer mit der gleichen ID bereits existieren. Weiter sollten am Besten keine Zeiten gespeichert sein, vor allem nicht unter einer userID, die ihr verwenden wollt für einen neuen Nutzer. Auch sollten gelöschte Nutzer im Idealfall nicht existieren.

[1] kimai.org
[2] phpmyadmin.net

Letzte Bearbeitung: 12.10.2016 22:46