HowTo: Implementierung des Logins in der Demo2

Einleitung

In diesem Use Case werden folgende Funktionen in die Demo2 eingebaut:

  • Ein Loginformular
  • Anzeigen des Loginformulars/des aktuellen Benutzers abhängig vom Benutzerstatus
  • Die Möglichkeit auszuloggen

Verwendete Dateien

Diese Dateien können mit einem normalen Texteditor bearbeitet werden (z.B. dem Windows Editor) INSTALLATIONSDIR\webroot\demo2\includes\top.ijsp (zur Testseite)

Das Login HTML-Formular

Wir wollen an der Stelle, an der sich derzeit nur der aktuelle Benutzername befindet, die Loginfunktionalität einbauen. Mit der Methode core.getUserName() kann der aktuelle Benutzer abgefragt werden:

top.ijsp Zeile 100:

<td class="greybox">
  <!-- content-->
  <%=core.getUserName()%>
  <!-- End content -->
</td>

Zusätzlich zur Ausgabe des Benutzernamens wird an dieser Stelle das Login-Formular eingebaut:

top.ijsp Zeile 100:

<td class="greybox">
  <!-- content-->
  <%=core.getUserName()%>
  <form method="post">
    Name:<br>
    <input name="Login_username"><br>
    Passwort:<br>
    <input type="password" name="Login_userauth"><br>
    <input type="submit" name="Login_createEntry" value="Einloggen">
  </form>
  <!-- End content -->
</td>

Die Namen der Inputfelder können der Core-Implementiersdokumentation entnommen werden.

Die Loginfunktionalität

Da das Formular alleine noch keine Funktionalität beinhaltet muss diese im JSP eingebaut werden. Dazu muss zuerst das Login Modul initialisiert werden:

top.ijsp Zeile 1:

<%
  Login login = new Login(core);
%>
<html>  
  <head>

Danach wird die Funktion createEntry des Moduls Login aufgerufen. Diese kümmert sich um das einloggen der Benutz in das System:

top.ijsp Zeile 1:

<%
  Login login = new Login(core);
  login.createEntry();
%>
<html>  
  <head>

Nun ist es möglich sich mit einem gültigen Benutzer einzuloggen.

Anhand des Benutznamens erkennt man, dass das Einloggen funktioniert hat.

Das Loginformular nicht mehr anzeigen

Trotzdem man eingeloggt ist, sieht man immer noch das Loginformular. Zusätzlich ist das Anzeigen des Gastbenutzernamens nicht unbedingt schön. Um gewisse Teile des HTMLs abhängig vom Benutzerstatus (angemeldet/nicht angemeldet) auszublenden verwendet man am besten Java mit der Funktion core.isLoggedOn():

top.ijsp Zeile 103:

<td class="greybox">
<!-- content-->
<%
  if (core.isLoggedOn())
  {
    out.print (core.getUserName());
  }
  else
  {
%>
<form method="post">
  Name:<br>
  <input name="Login_username"><br>
  Passwort:<br>
  <input type="password" name="Login_userauth"><br>
  <input type="submit" name="Login_createEntry" value="Einloggen">
</form>
<%
  }
%>
<!-- End content -->
</td>

Mithilfe der gleichen Technik kann z.B. auch die Überschrift geändert werden.

Logout

Eine weitere wichtige Funktion ist das Abmelden. Die einfachste Methode ist, einen Link um den Benutzernamen zu legen:

top.ijsp Zeile 106:

<%
  if (core.isLoggedOn())
  {
    out.print ("< a href='?Login_deleteEntry=true'>"+core.getUserName()+"</a>");
  }
  else

Natürlich muss man auch die entsprechende Funktion des Login Moduls aufrufen:

top.ijsp Zeile 1:

<%
  Login login = new Login(core);
  login.createEntry();
  login.deleteEntry();
%>

Jetzt funktioniert das Abmelden. Es wird aber auffallen, das man sich danach nicht mehr Anmelden kann. Der Grund dafür besteht in der Art wie das Loginformular und der Link zusammenarbeiten: Auf der einen Seite steht in der URL immer noch:

auf der anderen Seite werden die Logindaten mittels Post mitgeschickt. D.h. das Login Modul bekommt sowohl die Anforderung sich einzuloggen, als auch sich auszuloggen. Für diese Problem gibt es 3 Lösungen

Vertauschen der Funktionen

top.ijsp Zeile 1:

<%
  Login login = new Login(core);
  login.deleteEntry();
  login.createEntry();
%>

Dadurch wird zwar das deleteEntry ausgeführt und der Benutzer abgemeldet, was dem Gast ziemlich egal sein wird, das anmelden geschieht aber danach. Dadurch kommt es zu keinen Konflikt, selbst wenn beide Funktionen ausgelöst werden. Dies ist die einfachste und schönste Lösung.

Ändern des Login Formulares auf get

top.ijsp Zeile 111:

  else
  {
%>
<form method="get">
  Name:<br>

Diese Lösung ist nicht zu empfehlen, da dadurch der Benutzername und das Passwort in der Addresszeile angezeigt werden.

Erstellen eines Logout-formulares mit post

top.ijsp Zeile 105:

<!-- content-->
<%
  if (core.isLoggedOn())
  {
%>
  <form method="post" name="logoutform">  
    <input type="hidden" name="Login_deleteEntry">
;     <a href="JavaScript:logoutform.submit()"><%=core.getUserName()%></a>
  </form>
<%
  }
  else

Diese Methode funktioniert, ist auch nicht so unsicher, aber auf jeden Fall deutlich komplizierter als die Methode 1. Die Teile des fertigen top.ijsp

Zeile 1:

<%
  Login login = new Login(core);
  login.deleteEntry();
  login.createEntry();
%>
<html>  
  <head>

Zeile 100:

<td class="greybox">
<!-- content-->
<%
  if (core.isLoggedOn())
  {
    out.print (core.getUserName());
  }
  else
  {
%>
<form method="post">
  Name:<br>
  <input name="Login_username"><br>
  Passwort:<br>
  <input type="password" name="Login_userauth"><br>
  <input type="submit" name="Login_createEntry" value="Einloggen">
</form>
<%
  }
%>
<!-- End content -->
</td>

Attachments