Windows-Nutzer im Webformular vorausfüllen

Heute stand ich vor der Herausforderung einen formulargestützten Prozess zu programmieren. Dabei war die eigentliche Herausforderung den Benutzernamen des angemeldeten Nutzers unter Windows in einem Feld vorauszufüllen.

Nach kurzer Recherche fand ich die Lösung mittels Java Applet. Eine andere Lösung per ActiveX-Object hab ich gleich wieder verworfen, weil die Sicherheitsrichtlinien dabei verändert werden müssen. Das werden die Nutzer des Formulars nicht tun.

Nun also die Lösung per Java Applet.

/**
* The Username returns the system property user.name which is the session name
* of the current user logged in.
*/
import java.applet.*;
import java.awt.*;

/**
* @author Kummerr
*/
public class Username extends Applet
{
        protected String username = "";

        /**
         * initialize
         */
        public void init()
        {
                username = System.getProperty("user.name");
                super.init();
        }

        /**
         * returns username
         * @return String
         */
        public String get()
        {
                getAppletContext().showStatus("Username is " + username);
                return username;
        }

        /**
         * draws the username
         * @param Graphics g
         */
        public void paint(Graphics g)
        {
                super.paint(g);
                g.drawString(username,5,15);
        }
}

Der Nutzername steht in dem Property „user.name“ und läßt sich somit ganz einfach auslesen. Die Methode paint() schreibt mir den gefundenen Namen auf die Applet-Zeichenfläche (Canvas). Dies ist für Kontrollzwecke sehr positiv.

Die Methode get() werde ich per Javascript von der Formularseite aus ansprechen und darüber den Nutzernamen laden. Zusätzlich wird der Fensterstatus diesen Namen anzeigen.

Hier nun das HTML-File:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta>
<title>Insert title here</title>
<script language="Javascript" type="text/javascript">
//<![CDATA[
<!--
function get()
{
        document.userform.username.value = document.usernameapp.get();
}
//-->
//]]>
</script>

</head>
<body>

<applet name="usernameapp" archive="username.signed.jar" code="Username.class" width="1" height="1"></applet>

<form>
<input name="username" />
<input onclick="get();" value="Get" type="button" />
</form>

So kann man die Daten übertragen. Ich hab das mit eclipse programmiert und eclipse legt automatisch eine policy-Datei an, die Rechte auf alles erlaubt. Dies ist im Live-Modus nicht zu empfehlen. Stattdessen hab ich meine Datei mit dem policytool angepasst.

Hier meine Policy-Datei:

/* AUTOMATICALLY GENERATED ON Tue Mar 29 10:23:43 CEST 2011*/
/* DO NOT EDIT */

keystore "file:/c:/Documents and Settings/XXXXXXXXX/.keystore", "jks";

grant signedBy "mykey" {
  permission java.util.PropertyPermission "user.name", "read";
};

Unter Angabe meines Keystores hab ich nur Lesezugriff auf das System-Property user.name gegeben. Mehr verwende ich auch nicht.

Da ohne Angabe der korrekten Policy immer eine Exception in Javascript kommt hier nochmal der Weg zu einem signierten JAR mit korrekter Policy.

  1. Keystore mit keytool (aus dem JDK) erzeugen.
    keytool -genkey
  2. Self-Signed Zertifikat erstellen (self-signed Zertifikate sind nur 6 Monate gültig)
    keytool -selfcert
  3. JAR aus der Klasse erzeugen
    jar cvf username.jar Username.class
  4. Signiertes JAR erzeugen
    jarsigner -signedjar username.signed.jar username.jar mykey

Im letzten Schritt wird bei der Signierung mein Alias aus dem Keystore angegeben. Dieser wird automatisch auf „mykey“ gesetzt, wenn man bei „keytool -genkey“ keine weiteren Optionen angibt. Die Policy nutzt ebenfalls diesen Alias bei „SignedBy“.

Im Browser muss man beim ersten Start des Applets noch die Ausführung bestätigen, dann läuft es.

Während der Entwicklung ändert man immer mal die Policy und den Quellcode. Hier empfiehlt es sich gerade bei Änderungen in der Policy den Cache zu löschen, da dieser nur beim ersten Laden gespeichert wird. Das hat mich ne halbe Stunde fluchen gekostet.

Der Quellcode zum Artikel kann heruntergeladen werden: Username-Applet