CMS:USER_LOGIN

Überprüft die Anmeldedaten eines Frontend-Users und erzeugt eine neue Session.

(CMS:USER_LOGIN [parameter=wert …])

Methode: Modules\Record\RecordUser::cmsLogin()
PHP-Schnipsel: include_and_stop (danach)

Parameter

Parameter Wert Standard Pflicht Beschreibung
successtemplate – – ja Detailtemplate, das nach einer erfolgreichen Anmeldung eingebunden wird.
container Container-ID oder -Name – ja ID oder Name des Profil-Containers, in dem die Daten der Frontend-User gespeichert sind.
data PHP-Variablenname data Name des PHP-Arrays, in dem die Anmeldedaten enthalten sind.
message[…] Standardmeldung – Fehlermeldungen. Im Index: Anwendungsfall; im Wert: Meldungstext (vgl. Tabelle).
hash Hash – Ein Login kann auch mittels Hash durchgeführt werden (Token aus CMS:USER_PW, Passwort vergessen).
trim true / false false true: Leerzeichen am Anfang und Ende der Eingaben entfernen.
cookie true / false true true: Es wird standardmäßig ein Cookie gesetzt, um die Anmeldung über mehrere Seiten hinweg aufrechtzuerhalten.
submit Textwert – Der Befehl wird nur ausgeführt, wenn in diesem Feld ein Text enthalten ist. Entfällt bei der Anmeldung per "hash".
cookiename Cookiename usess Name des Session-Cookies [a-z0-9].
csrf true / false true true: Der Request muss ein gültiges Token aus CMS:USER_TOKEN enthalten (Schutz gegen CSRF). false schaltet die Prüfung für diesen Befehl ab – nur mit gutem Grund.
codetemplate – – Template für den zweiten Schritt der Anmeldung, wenn der Profil-Bereich einen zweiten Faktor verlangt. Pflicht, sobald der Bereich einen einsetzt.

[…] – der Parameter nimmt Unterschlüssel an, z. B. name[schlüssel]=wert.

Anwendung

Prüft Anmeldename und Passwort gegen den Profil-Bereich und legt eine Session an (Cookie). Die Felder sind die im Bereich als Anmeldename und Passwort festgelegten (data[nickname], data[password]); nach Erfolg wird successtemplate eingebunden, darin ist das Profil der laufende Datensatz und $set['user_id'] / $set['user'] sind gefüllt:

<?php $submit = $_POST['submit'] ?? ''; ?>
(CMS:USER_LOGIN container=members submit="$submit" successtemplate=u_welcome)
<h1>Anmeldung</h1>
<p class="error">(CMS:MESSAGE)</p>
<form method="post">
  (CMS:USER_TOKEN)
  <input name="data[nickname]" value="(CMS:TEXT useval="{$_POST['data']['nickname']}" specialchars=true)">
  <input type="password" name="data[password]">
  <button name="submit" value="1">Anmelden</button>
</form>

Anmeldung über den Link aus CMS:USER_PW (Passwort vergessen):

(CMS:USER_LOGIN container=members hash="{$_GET['hash']}" successtemplate=u_newpw)

Der Befehl gehört an den Anfang des Templates (Cookie vor der Ausgabe). Fehlversuche werden gezählt (Brute-Force-Schutz). Meldungs-Indizes: failed, blocked, disabled (Status 1), unconfirmed (Status 2), hash, container, token. Gezählt wird je Anmeldename und zusätzlich je Herkunft (IP-Adresse): wer von einem Anschluss aus viele Konten mit je einem Passwort durchprobiert, wird ebenfalls gesperrt (blocked).

Zweiter Faktor

Im Profil-Bereich legt der Administrator fest, ob eine Anmeldung in zwei Schritten nötig ist (Einstellung „Zweiter Faktor“: aus, freiwillig, Code bei neuem Gerät, immer). Braucht eine Anmeldung einen Code, meldet USER_LOGIN nach dem richtigen Passwort noch niemanden an, sondern bindet codetemplate ein. Dort stehen:

$set[…] Inhalt
second_factor totp (Code aus der Authenticator-App) oder email (Code per E-Mail)
login_pending 1
pending_user das Profil (auch der laufende Datensatz) – etwa für die E-Mail-Adresse
login_code beim Code per E-Mail: der sechsstellige Code, den Sie verschicken

Das codetemplate verschickt den Code mit CMS:EMAIL und zeigt das Formular für CMS:USER_LOGIN_CODE (Beispiel dort). Wie alle CMS:USER_*-Befehle verschickt USER_LOGIN selbst keine E-Mail – das tut immer das Template. Auch die Anmeldung über den Link aus „Passwort vergessen“ (hash) verlangt den Code, wenn der Frontend-User eine Authenticator-App eingerichtet hat; die Einrichtung selbst übernimmt CMS:USER_2FA.

(CMS:USER_LOGIN container=members submit="$submit" successtemplate=u_welcome codetemplate=u_code_mail)

Anmeldung von einem neuen Gerät

camindo merkt sich die Geräte (Browser), mit denen sich ein Profil anmeldet. Kommt die Anmeldung von einem unbekannten Gerät und hat das Profil schon andere, steht im successtemplate $set['new_device'] auf 1; $set['device'] enthält label (z. B. „Firefox / macOS“), ip und time (UTC). Den Hinweis an den Inhaber schicken Sie selbst – vor der Weiterleitung, mit CMS:EMAIL:

<?php
$to = (string)($set['user']['email'] ?? '');
$send = (!empty($set['new_device']) && $to !== '') ? '1' : '';
$body = "Neue Anmeldung: {$set['device']['label']}, IP {$set['device']['ip']}, {$set['device']['time']} UTC."
      . " Waren Sie das nicht, setzen Sie bitte ein neues Passwort.";
?>
(CMS:EMAIL submit="$send" to="$to" subject="Neue Anmeldung" body="$body")

Die allererste Anmeldung eines Profils löst keinen Hinweis aus. Ob stattdessen eine SMS geht, legt der Systemadministrator fest (siehe Handbuch für Administratoren, Betrieb).

Parameter im Einzelnen

successtemplate

(CMS:USER_LOGIN container=members submit="$submit" successtemplate=u_welcome)

In u_welcome: Hallo (CMS:TEXT nickname) - das Profil ist dort der laufende Datensatz.

container

Profil-Bereich (Name oder Id):

(CMS:USER_LOGIN container=members …)

data

Name des Request-Arrays mit den Anmeldedaten (Standard data):

<input name="login[nickname]"> <input type="password" name="login[password]">
(CMS:USER_LOGIN container=members data=login submit="$submit" successtemplate=u_welcome)

message

(CMS:USER_LOGIN container=members submit="$submit" successtemplate=u_welcome
  message[failed]="Name oder Passwort falsch."
  message[unconfirmed]="Bitte bestätigen Sie zuerst Ihre E-Mail-Adresse."
  message[blocked]="Zu viele Fehlversuche – bitte später erneut versuchen."
)

hash

Anmeldung per Einmal-Token aus CMS:USER_PW statt mit Passwort; submit entfällt:

(CMS:USER_LOGIN container=members hash="{$_GET['hash']}" successtemplate=u_newpw)

In u_newpw setzt der Frontend-User per CMS:USER_INPUT container=members id="{$set['user_id']}" fields=password ein neues Passwort. Nach dieser Anmeldung ist $set['password_reset'] 1: eine Stunde lang (Einstellung user.password_token_expiration) braucht er dafür das bisherige Passwort nicht – siehe CMS:USER_INPUT, Passwort ändern.

codetemplate

Template für den zweiten Schritt (siehe oben):

(CMS:USER_LOGIN container=members submit="$submit" successtemplate=u_welcome codetemplate=u_code_mail)
(CMS:USER_LOGIN container=members hash="{$_GET['hash']}" successtemplate=u_newpw codetemplate=u_code_mail)

Fehlt es, obwohl der Bereich einen zweiten Faktor verlangt, scheitert die Anmeldung mit failed und einem Eintrag im Protokoll user.

trim

Leerzeichen um Name und Passwort entfernen (Kopierfehler auf Mobilgeräten):

(CMS:USER_LOGIN container=members trim=true submit="$submit" successtemplate=u_welcome)

Kein Cookie setzen - die Session-Id steht dann nur in $set['user_session_id'] (für Apps, die sie selbst weiterreichen):

(CMS:USER_LOGIN container=members cookie=false submit="$submit" successtemplate=api_token)

submit

Nur ausführen, wenn das Formular abgeschickt wurde:

<?php $submit = $_POST['submit'] ?? ''; ?>
(CMS:USER_LOGIN container=members submit="$submit" successtemplate=u_welcome)

cookiename

(CMS:USER_LOGIN container=members cookiename=shop submit="$submit" successtemplate=u_welcome)

Muss bei allen USER_*-Befehlen gleich sein.


← Übersicht

Stand: camindo CMS 9.1.3