Login-Bereich erstellen

Ein Anmeldeformular, das jeder bedienen kann

Benutzerfeld, Passwortfeld, Anmeldeknopf: drei Stellen im Login.

Website prüfen
Beispiel im Prüfbericht Markierter Befund
Markierter Befund · Kritisch · WCAG 4.1.2Regler ohne zugänglichen Namen

Login-Architektur

Das Formular ist nur die Eingangstür

Ein belastbarer Login verbindet zugängliche Eingabe, serverseitige Prüfung, Sitzung und Berechtigung.

Konzeptansicht · Browser und Server

Drei Wege durch denselben Login-Bereich

Die Vertrauensgrenze liegt am Server. Sichtbar angemeldet zu sein ersetzt dort keine Berechtigungsprüfung.

01Anmelden
Browser · Formular
E-Mail-Adressename@example.dePasswort••••••••••••Anmelden
autocomplete erlaubt Passwortmanagern beide Felder zuzuordnen.
Server · AuthentifizierungKonto suchen und Hash prüfenImmer über HTTPS; Passwort nie als Klartext speichern.
Eine Entscheidung
Fehler„E-Mail-Adresse oder Passwort stimmt nicht.“
ErfolgAlte Kennung verwerfen, neue Sitzung anlegen.
02Sitzung
Server · neuer ZustandZufällige SitzungskennungDie Rolle und Kontodaten bleiben serverseitig.
Browser · FolgebesuchCookie automatisch mitsendenDas Frontend muss die Kennung nicht auslesen.
03Zugriff
Jede AnfrageGET /projekte/42Eine gültige Sitzung nennt die Identität.
Server · BerechtigungDarf dieses Konto genau dieses Projekt sehen?
Explizites Ergebnis
ErlaubtRessource liefern
Verweigert403 senden
Authentifizierung beantwortet „Wer ist da?“. Autorisierung beantwortet bei jeder Anfrage „Darf dieses Konto das?“. Eine versteckte Schaltfläche im Frontend ist keine Zugriffskontrolle.

Zugänglicher Eingang

Das Passwort muss nicht aus dem Gedächtnis kommen

WCAG 2.2 erlaubt Benutzername und Passwort, wenn Browser oder Passwortmanager die Felder ausfüllen können. Kopieren und Einfügen darf nicht blockiert werden.

Passwortmanagerautomatisch ausfüllen
Zwischenablagekopieren und einfügen
Tastatursichtbare Beschriftungen
Passwort••••••••••••autocomplete="current-password"

Implementierungsvertrag

Browser und Server teilen die Arbeit sauber auf

Das HTML beschreibt Eingabe und Fehler. Der Server prüft, rotiert, begrenzt und entscheidet.

HTMLFormular und Fehler
<h1>Anmelden</h1>

<form action="/anmelden" method="post">
  <p id="login-error" role="alert">
    E-Mail-Adresse oder Passwort stimmt nicht.
  </p>

  <label for="email">E-Mail-Adresse</label>
  <input id="email" name="email" type="email"
    autocomplete="username" required
    aria-describedby="login-error">

  <label for="password">Passwort</label>
  <input id="password" name="password" type="password"
    autocomplete="current-password" required
    aria-describedby="login-error">

  <a href="/passwort-vergessen">Passwort vergessen?</a>
  <button type="submit">Anmelden</button>
</form>

Rendern Sie den Fehlerabsatz nur nach einem fehlgeschlagenen Versuch.

Server-PseudocodePrüfen und Sitzung rotieren
POST /anmelden
  konto = findeKonto(email)
  hash = konto?.passwortHash ?? DUMMY_HASH
  gültig = prüfePasswort(passwort, hash)

  wenn !konto oder !gültig:
    antworte mit demselben neutralen Fehler

  lösche alte Sitzungskennung
  sitzung = erzeugeSitzung(konto.id)

  Set-Cookie: __Host-session=<zufällig>;
    Secure; HttpOnly; SameSite=Lax; Path=/

JEDE GESCHÜTZTE ANFRAGE
  sitzung = liesUndPrüfeCookie()
  wenn !sitzung: antworte 401
  wenn !darfZugreifen(sitzung.konto, ressource):
    antworte 403
  liefere ressource

SameSite ergänzt den CSRF-Schutz; es ersetzt kein passendes CSRF-Token für zustandsändernde Anfragen.

Sitzungsende

Abmelden ist eine Serveraktion

AktivCookie + serverseitige Sitzung
POST /abmeldenSitzung invalidieren
AntwortCookie mit Max-Age=0 löschen

Prüfprotokoll

Vier Belege statt „funktioniert bei mir“

Tastatur
Felder, Recovery-Link und Anmelden in verständlicher Reihenfolge; jeder Fokus sichtbar.
Hilfsmittel
Labels werden angesagt, Autofill und Einfügen funktionieren, Fehler erscheint als Meldung.
Sitzung
Kennung wechselt beim Login; Cookie trägt Secure, HttpOnly, SameSite und Path.
Zugriff
Fremde Objekt-ID und abgelaufene Sitzung liefern 403 beziehungsweise 401, auch bei direkter URL.

Aus dem Prüfbericht

Drei Befunde im Anmeldeformular

Kritisch Benutzername und Passwort ohne Beschriftung Regel label

Ein Platzhalter verschwindet beim Tippen und ist kein Name. Ein label mit for verbindet den sichtbaren Text mit dem Login-Feld.

Anleitung: Formularfelder eindeutig beschriften

Zum Mitnehmen

Das Anmeldeformular, korrigiert

Zwei Beschriftungen, zwei gültige Eingabezwecke, ein Name am Knopf.

Korrektur in 3 Schritten ansehen
  1. Die beiden Felder beschriften

    Ein label mit for auf die id macht den sichtbaren Text zum Namen des Felds. Der Platzhalter bleibt allenfalls ein Beispiel.

    KorrekturvergleichSchritt 1 · HTML

    Vorher

    <input type="text" name="user" placeholder="Benutzername">
    <input type="password" name="pass" placeholder="Passwort">

    Nachher

    <label for="user">Benutzername</label>
    <input id="user" type="text" name="user">
    <label for="pass">Passwort</label>
    <input id="pass" type="password" name="pass">

    Markierte Zeilen wurden geändert

    So prüfen Sie es Klicken Sie auf „Passwort“. Springt der Cursor ins Feld, sitzt die Verbindung.

  2. Den Eingabezweck gültig setzen

    username und current-password sind die standardisierten Werte für eine Anmeldung. Erfundene Werte helfen beim Ausfüllen nicht.

    KorrekturvergleichSchritt 2 · HTML

    Vorher

    <input id="user" type="text" name="user" autocomplete="loginname">
    <input id="pass" type="password" name="pass" autocomplete="passwort">

    Nachher

    <input id="user" type="text" name="user" autocomplete="username">
    <input id="pass" type="password" name="pass"
      autocomplete="current-password">

    Markierte Zeilen wurden geändert

    So prüfen Sie es Öffnen Sie das Formular mit gespeicherten Zugangsdaten. Der Browser bietet beide Werte an.

  3. Den Knopf am Passwortfeld benennen

    Das Symbol bleibt für Vorleseprogramme verborgen. Ein aria-label nennt die Aktion, die der Knopf am Passwortfeld auslöst.

    KorrekturvergleichSchritt 3 · HTML

    Vorher

    <button type="button" class="reveal">
      <span aria-hidden="true">👁</span>
    </button>

    Nachher

    <button type="button" class="reveal" aria-label="Passwort anzeigen">
      <span aria-hidden="true">👁</span>
    </button>

    Markierte Zeilen wurden geändert

    So prüfen Sie es Gehen Sie mit Tab auf den Knopf. Ein Vorleseprogramm sagt „Passwort anzeigen, Schaltfläche“.

Werbung

Kostenloser Website-Barrierefreiheits-Check

Website auf Barrierefreiheit prüfen.

Technische WCAG-Warnsignale erkennen. Kritische Stellen zuerst prüfen.

Der Website-Check ist bereit.

Werbung

Ein letzter Schritt

Prüfen, bevor Sie gehen.

Finden Sie automatisch erkennbare Barrieren auf Ihrer eigenen Website.

Website prüfen

Kostenlos starten · keine Installation

Automatisches Screening. Tastaturbedienung und Screenreader bleiben manuelle Prüfung.