- 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.
215 lines
5.4 KiB
Markdown
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
|
|
```
|