Konten gab es bisher nur über die Konsole. Unter "Benutzer" legt ein Administrator jetzt Konten an, ändert Rollen, setzt Passwörter und löscht Konten; unter "Mein Konto" ändert jeder sein eigenes Passwort, aber nur mit dem aktuellen in der Hand. Eine Rolle je Konto: Administrator, Veröffentlicher, Redakteur. Ein Passwort oder eine Rolle zu ändern meldet jede offene Sitzung dieses Kontos ab - dafür war nichts zu bauen, CmsUser::isEqualTo vergleicht Hash und Rollen mit der Datenbank. Genau eine Sitzung überlebt: die, die ihr eigenes Passwort geändert hat. "Jemanden sofort aussperren" ist damit dasselbe wie "Passwort setzen". Es bleibt immer ein Administrator übrig, nicht über eine Zählung, sondern weil niemand sein eigenes Konto löschen oder herabstufen kann und jede Änderung die Administratorrolle voraussetzt. Die zusätzliche Prüfung auf einen zweiten Administrator war damit unerreichbar und ist wieder heraus. Mediathek (Umut: "das sollte direkt laden in pagination"): /admin/media zeigt die Bilder jetzt selbst, 24 je Seite, neueste zuerst, mit Blättern und einem Schalter für archivierte. Hochladen und Bildangaben laufen über gewöhnliche Formulare ohne JavaScript; der Dialog bleibt der Weg, beim Bearbeiten ein Bild auszuwählen. Die Bild-ID steht in jeder Karte, weil Beitragsbild und Teilen-Vorschau genau diese ID erwarten. Die Migrationsliste der Testfixtures stand dreimal da und steht jetzt einmal in tests/TestSchema.php. 217 PHP-Tests / 845 Assertions unter PHP 8.2.12 und 8.4.22. axe deckt jetzt elf Bildschirme ab statt drei - alle Verwaltungsseiten, nicht nur Anmeldung, Seitenliste und Editor -, null Verstöße. Nicht geprüft: kein Screenreader; Blättern und Upload sind mit zwei Bildern geprüft, nicht mit einer großen Bibliothek. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
44 lines
2.3 KiB
Twig
44 lines
2.3 KiB
Twig
{% extends 'admin/shell.html.twig' %}
|
|
{% set nav = 'account' %}
|
|
{% block title %}Mein Konto{% endblock %}
|
|
{% block heading %}Mein Konto{% endblock %}
|
|
{% block lead %}Dein Passwort kannst du hier selbst ändern. Deine Rolle kann nur ein Administrator ändern.{% endblock %}
|
|
{% block content %}
|
|
|
|
<div class="card">
|
|
<div class="card-head"><h2>{{ app.user.userIdentifier }}</h2><span class="muted">{{ account ? roles[account.role] : 'Rolle unbekannt' }}</span></div>
|
|
<div class="card-body">
|
|
{% if account %}
|
|
<p class="muted">{{ roleHelp[account.role] }}</p>
|
|
<p class="field-help">
|
|
{% if account.lastLoginAt %}Zuletzt angemeldet am {{ account.lastLoginAt|date('d.m.Y H:i') }} UTC{% else %}Dies ist deine erste Sitzung{% endif %}.
|
|
{% if account.passwordChangedAt %} Passwort zuletzt geändert am {{ account.passwordChangedAt|date('d.m.Y') }}.{% endif %}
|
|
{% if account.createdAt %} Konto angelegt am {{ account.createdAt|date('d.m.Y') }}.{% endif %}
|
|
</p>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
|
|
<div class="card">
|
|
<div class="card-head"><h2>Passwort ändern</h2><span class="muted">Andere Sitzungen werden abgemeldet</span></div>
|
|
<form action="{{ path('admin_account_password') }}" method="post" class="card-body">
|
|
<input type="hidden" name="_csrf_token" value="{{ csrf_token('account') }}">
|
|
<div class="fields">
|
|
<div>
|
|
<label for="current">Aktuelles Passwort</label>
|
|
<input id="current" name="current" type="password" required autocomplete="current-password" maxlength="{{ maxPassword }}">
|
|
<p class="field-help">Nötig, damit eine vergessene offene Sitzung nicht ausreicht, um dein Konto zu übernehmen.</p>
|
|
</div>
|
|
<div>
|
|
<label for="password">Neues Passwort</label>
|
|
<input id="password" name="password" type="password" required autocomplete="new-password" minlength="{{ minPassword }}" maxlength="{{ maxPassword }}">
|
|
<p class="field-help">Mindestens {{ minPassword }} Zeichen, höchstens {{ maxPassword }} Bytes. Diese Sitzung bleibt angemeldet, alle anderen dieses Kontos nicht.</p>
|
|
</div>
|
|
</div>
|
|
<button class="primary" type="submit">Passwort ändern</button>
|
|
</form>
|
|
</div>
|
|
|
|
<p class="footnote">Kant CMS · Arbeitsstand</p>
|
|
{% endblock %}
|