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

215 lines
5.4 KiB
Markdown

# 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
```