- Introduced a new SettingsManagement view for administrators to manage system settings. - Added routes and components for settings management, including minimum password length and password login options. - Implemented a SettingsService to handle retrieval and updating of settings. - Created a new Setting entity and repository for database interactions. - Added validation for password length using a custom PasswordMinLength validator. - Updated SecurityController to check if password login is allowed. - Enhanced UserManagement view to provide detailed error messages on save and delete operations. - Implemented a DuplicateEmailExceptionListener to handle unique constraint violations for email addresses. - Updated security configuration to include the new LoginFormAuthenticator. - Created API endpoints for fetching and updating settings, secured with ROLE_ADMIN.
5.4 KiB
System-Einstellungen
Die System-Einstellungen erlauben es Administratoren, sicherheitsrelevante Konfigurationen für das CRM-System vorzunehmen.
Zugriff
Die Einstellungsseite ist nur für Benutzer mit der Rolle ROLE_ADMIN zugänglich und kann über die Navigation unter Einstellungen erreicht werden.
URL: /settings
Verfügbare Einstellungen
1. Mindestlänge für Passwörter
Einstellung: security.password_min_length
Typ: Integer (4-128)
Standard: 8 Zeichen
Legt die Mindestanzahl an Zeichen fest, die ein Passwort haben muss. Diese Einstellung wird beim Erstellen und Aktualisieren von Benutzern über die API validiert.
Verwendung im Code:
$minLength = $settingsService->getPasswordMinLength();
Validator:
Der PasswordMinLength-Validator prüft automatisch bei der Benutzerregistrierung und beim Passwort-Update, ob das Passwort die konfigurierte Mindestlänge erfüllt.
2. Login mit E-Mail und Passwort
Einstellung: security.allow_password_login
Typ: Boolean
Standard: true (erlaubt)
Steuert, ob sich Benutzer mit E-Mail und Passwort anmelden können. Wenn diese Einstellung deaktiviert ist, müssen Benutzer alternative Anmeldemethoden wie OIDC (Pocket-ID) verwenden.
Verwendung im Code:
$isAllowed = $settingsService->isPasswordLoginAllowed();
Wichtig:
- Stellen Sie sicher, dass mindestens eine alternative Login-Methode (z.B. OIDC) konfiguriert ist, bevor Sie den Passwort-Login deaktivieren
- Die Login-Seite zeigt automatisch nur die verfügbaren Anmeldemethoden an
- Der
LoginFormAuthenticatorblockiert Passwort-Login-Versuche, wenn die Einstellung deaktiviert ist
API Endpoints
GET /api/settings
Lädt alle Einstellungen
Berechtigung: ROLE_ADMIN
Response:
{
"settings": {
"passwordMinLength": 8,
"allowPasswordLogin": true
}
}
PUT /api/settings
Aktualisiert Einstellungen
Berechtigung: ROLE_ADMIN
Request:
{
"settings": {
"passwordMinLength": 12,
"allowPasswordLogin": false
}
}
Response:
{
"success": true,
"settings": {
"passwordMinLength": 12,
"allowPasswordLogin": false
},
"message": "Settings updated successfully"
}
Datenbank-Schema
Die Einstellungen werden in der Tabelle settings gespeichert:
CREATE TABLE settings (
id INT AUTO_INCREMENT PRIMARY KEY,
setting_key VARCHAR(100) UNIQUE NOT NULL,
setting_value LONGTEXT,
setting_type VARCHAR(50) NOT NULL,
description VARCHAR(255),
updated_at DATETIME NOT NULL
);
Unterstützte Typen:
string: Textwerteinteger: Ganzzahlenboolean: true/false (gespeichert als '1'/'0')float: Dezimalzahlenjson: JSON-Daten
Verwendung im Code
SettingsService verwenden
use App\Service\SettingsService;
class MyController extends AbstractController
{
public function __construct(
private SettingsService $settingsService
) {}
public function myAction(): Response
{
// Einzelne Einstellung lesen
$minLength = $this->settingsService->getPasswordMinLength();
$isAllowed = $this->settingsService->isPasswordLoginAllowed();
// Alle Einstellungen abrufen
$allSettings = $this->settingsService->getAllSettings();
// Einstellung setzen
$this->settingsService->setPasswordMinLength(10);
$this->settingsService->setPasswordLoginAllowed(false);
// Mehrere Einstellungen auf einmal aktualisieren
$this->settingsService->updateSettings([
'passwordMinLength' => 12,
'allowPasswordLogin' => true
]);
// ...
}
}
Neue Einstellungen hinzufügen
- Konstante in SettingsService definieren:
public const MY_NEW_SETTING = 'category.my_new_setting';
- Getter/Setter hinzufügen:
public function getMyNewSetting(): mixed
{
return $this->settingRepository->getValue(self::MY_NEW_SETTING, $defaultValue);
}
public function setMyNewSetting(mixed $value): void
{
$this->settingRepository->setValue(
self::MY_NEW_SETTING,
$value,
'string', // oder 'boolean', 'integer', etc.
'Description of my setting'
);
}
- In getAllSettings() und updateSettings() ergänzen:
public function getAllSettings(): array
{
return [
// ... existing settings
'myNewSetting' => $this->getMyNewSetting(),
];
}
public function updateSettings(array $settings): void
{
// ... existing code
if (isset($settings['myNewSetting'])) {
$this->setMyNewSetting($settings['myNewSetting']);
}
}
- Vue-Komponente aktualisieren:
Fügen Sie das neue Feld in
assets/js/views/SettingsManagement.vuehinzu.
Sicherheit
- Alle Einstellungs-Endpoints sind durch
#[IsGranted('ROLE_ADMIN')]geschützt - Der
LoginFormAuthenticatorprüft vor jedem Login, ob Passwort-Login erlaubt ist - Der
PasswordMinLength-Validator validiert Passwörter gegen die konfigurierte Mindestlänge - Einstellungen werden automatisch bei jeder Änderung mit Zeitstempel versehen
Migration
Die Tabelle wird durch Version20251108164116 erstellt und mit Standardwerten initialisiert:
security.password_min_length: 8security.allow_password_login: true (1)
Um die Migration auszuführen:
php bin/console doctrine:migrations:migrate