myCRM/SETTINGS.md
olli 47b5dd1c23 feat: Add settings management for password policies and login options
- 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.
2025-11-08 18:01:09 +01:00

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 LoginFormAuthenticator blockiert 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: Textwerte
  • integer: Ganzzahlen
  • boolean: true/false (gespeichert als '1'/'0')
  • float: Dezimalzahlen
  • json: 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

  1. Konstante in SettingsService definieren:
public const MY_NEW_SETTING = 'category.my_new_setting';
  1. 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'
    );
}
  1. 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']);
    }
}
  1. 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:

php bin/console doctrine:migrations:migrate