# 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:** ```php $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:** ```php $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 `LoginFormAuthenticator` blockiert Passwort-Login-Versuche, wenn die Einstellung deaktiviert ist ## API Endpoints ### GET /api/settings Lädt alle Einstellungen **Berechtigung:** ROLE_ADMIN **Response:** ```json { "settings": { "passwordMinLength": 8, "allowPasswordLogin": true } } ``` ### PUT /api/settings Aktualisiert Einstellungen **Berechtigung:** ROLE_ADMIN **Request:** ```json { "settings": { "passwordMinLength": 12, "allowPasswordLogin": false } } ``` **Response:** ```json { "success": true, "settings": { "passwordMinLength": 12, "allowPasswordLogin": false }, "message": "Settings updated successfully" } ``` ## Datenbank-Schema Die Einstellungen werden in der Tabelle `settings` gespeichert: ```sql 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`: Textwerte - `integer`: Ganzzahlen - `boolean`: true/false (gespeichert als '1'/'0') - `float`: Dezimalzahlen - `json`: JSON-Daten ## Verwendung im Code ### SettingsService verwenden ```php 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 1. **Konstante in SettingsService definieren:** ```php public const MY_NEW_SETTING = 'category.my_new_setting'; ``` 2. **Getter/Setter hinzufügen:** ```php 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' ); } ``` 3. **In getAllSettings() und updateSettings() ergänzen:** ```php 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']); } } ``` 4. **Vue-Komponente aktualisieren:** Fügen Sie das neue Feld in `assets/js/views/SettingsManagement.vue` hinzu. ## Sicherheit - Alle Einstellungs-Endpoints sind durch `#[IsGranted('ROLE_ADMIN')]` geschützt - Der `LoginFormAuthenticator` prü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`: 8 - `security.allow_password_login`: true (1) Um die Migration auszuführen: ```bash php bin/console doctrine:migrations:migrate ```