539 lines
15 KiB
Markdown
539 lines
15 KiB
Markdown
# Authentication & Authorization System Plan
|
|
|
|
## Overzicht
|
|
|
|
Dit plan beschrijft de implementatie van een login systeem met rollen en rechten voor de Telvero Talpa Planning applicatie.
|
|
|
|
## Rollen & Rechten
|
|
|
|
### Admin Rol
|
|
- **Volledige toegang** tot alle functionaliteiten
|
|
- Kan infomercials toevoegen, bewerken en verwijderen
|
|
- Kan uitzendingen plannen, bewerken en verwijderen
|
|
- Kan synchroniseren met Talpa API
|
|
- Kan blokken beheren
|
|
- Kan gebruikers beheren (toevoegen, bewerken, verwijderen)
|
|
|
|
### Guest Rol
|
|
- **Alleen lezen** toegang
|
|
- Kan dashboards bekijken
|
|
- Kan planning bekijken (kalender, planner)
|
|
- Kan infomercials bekijken
|
|
- Kan blokken bekijken
|
|
- **Geen** toevoeg-, bewerk- of verwijderfunctionaliteit
|
|
- **Geen** sync functionaliteit
|
|
- **Geen** gebruikersbeheer
|
|
|
|
## Database Schema
|
|
|
|
### Tabel: `users`
|
|
```sql
|
|
CREATE TABLE users (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
username VARCHAR(50) UNIQUE NOT NULL,
|
|
email VARCHAR(100) UNIQUE NOT NULL,
|
|
password_hash VARCHAR(255) NOT NULL,
|
|
role ENUM('admin', 'guest') DEFAULT 'guest',
|
|
is_active BOOLEAN DEFAULT 1,
|
|
last_login TIMESTAMP NULL,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
INDEX idx_username (username),
|
|
INDEX idx_email (email),
|
|
INDEX idx_role (role)
|
|
);
|
|
```
|
|
|
|
### Tabel: `sessions`
|
|
```sql
|
|
CREATE TABLE sessions (
|
|
id VARCHAR(128) PRIMARY KEY,
|
|
user_id INT NOT NULL,
|
|
ip_address VARCHAR(45),
|
|
user_agent VARCHAR(255),
|
|
last_activity TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
|
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
FOREIGN KEY (user_id) REFERENCES users(id) ON DELETE CASCADE,
|
|
INDEX idx_user_id (user_id),
|
|
INDEX idx_last_activity (last_activity)
|
|
);
|
|
```
|
|
|
|
### Tabel: `login_attempts`
|
|
```sql
|
|
CREATE TABLE login_attempts (
|
|
id INT PRIMARY KEY AUTO_INCREMENT,
|
|
username VARCHAR(50),
|
|
ip_address VARCHAR(45),
|
|
success BOOLEAN DEFAULT 0,
|
|
attempted_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
INDEX idx_username (username),
|
|
INDEX idx_ip_address (ip_address),
|
|
INDEX idx_attempted_at (attempted_at)
|
|
);
|
|
```
|
|
|
|
## Bestandsstructuur
|
|
|
|
```
|
|
/
|
|
├── auth/
|
|
│ ├── login.php # Login pagina
|
|
│ ├── logout.php # Logout handler
|
|
│ ├── auth_functions.php # Authenticatie functies
|
|
│ └── middleware.php # Access control middleware
|
|
├── admin/
|
|
│ └── users.php # Gebruikersbeheer (admin only)
|
|
├── migrations/
|
|
│ └── 003_add_authentication.sql
|
|
└── (bestaande bestanden worden aangepast)
|
|
```
|
|
|
|
## Implementatie Details
|
|
|
|
### 1. Authenticatie Functies (`auth/auth_functions.php`)
|
|
|
|
```php
|
|
// Kernfuncties:
|
|
- login($username, $password) // Inloggen
|
|
- logout() // Uitloggen
|
|
- isLoggedIn() // Check of gebruiker ingelogd is
|
|
- getCurrentUser() // Haal huidige gebruiker op
|
|
- hasRole($role) // Check of gebruiker rol heeft
|
|
- requireLogin() // Forceer login (redirect)
|
|
- requireRole($role) // Forceer specifieke rol
|
|
- hashPassword($password) // Wachtwoord hashen
|
|
- verifyPassword($password, $hash) // Wachtwoord verifiëren
|
|
- createSession($userId) // Sessie aanmaken
|
|
- destroySession() // Sessie vernietigen
|
|
- logLoginAttempt($username, $success) // Log inlogpoging
|
|
- checkBruteForce($username, $ip) // Brute force bescherming
|
|
```
|
|
|
|
### 2. Middleware (`auth/middleware.php`)
|
|
|
|
```php
|
|
// Access control functies:
|
|
- checkAuthentication() // Check authenticatie
|
|
- checkAuthorization($requiredRole) // Check autorisatie
|
|
- canCreate() // Kan aanmaken?
|
|
- canEdit() // Kan bewerken?
|
|
- canDelete() // Kan verwijderen?
|
|
- canSync() // Kan synchroniseren?
|
|
```
|
|
|
|
### 3. Login Pagina (`auth/login.php`)
|
|
|
|
**Features:**
|
|
- Username/email + wachtwoord formulier
|
|
- "Onthoud mij" functionaliteit
|
|
- Foutmeldingen bij ongeldige credentials
|
|
- Brute force bescherming (max 5 pogingen per 15 minuten)
|
|
- Redirect naar oorspronkelijke pagina na login
|
|
- Responsive design (Bootstrap)
|
|
|
|
### 4. Gebruikersbeheer (`admin/users.php`)
|
|
|
|
**Features (alleen voor admins):**
|
|
- Lijst van alle gebruikers
|
|
- Gebruiker toevoegen
|
|
- Gebruiker bewerken (username, email, rol)
|
|
- Gebruiker deactiveren/activeren
|
|
- Wachtwoord resetten
|
|
- Laatste login datum tonen
|
|
- Zoek- en filterfunctionaliteit
|
|
|
|
### 5. Bestaande Pagina's Aanpassen
|
|
|
|
Alle bestaande pagina's moeten worden aangepast:
|
|
|
|
#### Bovenaan elke pagina toevoegen:
|
|
```php
|
|
<?php
|
|
require_once __DIR__ . '/auth/auth_functions.php';
|
|
require_once __DIR__ . '/auth/middleware.php';
|
|
|
|
// Forceer login
|
|
requireLogin();
|
|
|
|
// Voor admin-only pagina's:
|
|
// requireRole('admin');
|
|
?>
|
|
```
|
|
|
|
#### Navigatie aanpassen:
|
|
- Gebruikersnaam tonen
|
|
- Logout knop toevoegen
|
|
- Rol badge tonen (Admin/Guest)
|
|
|
|
#### UI Aanpassingen voor Guest rol:
|
|
|
|
**Dashboard (`index.php`):**
|
|
- Verberg "Infomercial Registreren" formulier
|
|
- Verberg "Tijdblok Reserveren" formulier
|
|
- Verberg "Sync" knoppen
|
|
- Verberg "Opslaan" knoppen in Media Asset Management
|
|
|
|
**Planner (`planner.php`):**
|
|
- Verberg "Toevoegen" formulieren
|
|
- Verberg "Verwijderen" knoppen
|
|
- Verberg "Reorder" knoppen (pijltjes)
|
|
- Verberg "Sync" knoppen
|
|
- Verberg "Blok tijd aanpassen" knoppen
|
|
- Verberg "Kopieer blok" knoppen
|
|
- Disable drag-and-drop functionaliteit
|
|
|
|
**Kalender (`calendar.php`):**
|
|
- Disable drag-and-drop functionaliteit
|
|
- Verberg "Sync" knoppen
|
|
- Verberg "Verwijderen" knoppen in event modal
|
|
- Maak kalender read-only (geen event creation/editing)
|
|
|
|
**Blokken (`blocks.php`):**
|
|
- Verberg "Nieuw Template" knop
|
|
- Verberg "Bewerken" knoppen
|
|
- Verberg "Verwijderen" knoppen
|
|
- Verberg formulieren
|
|
|
|
**Infomercials (`infomercials.php`):**
|
|
- Verberg "Registreren" formulier
|
|
- Verberg "Bewerken" knoppen
|
|
- Verberg "Verwijderen" knoppen
|
|
- Verberg "Kleur aanpassen" functionaliteit
|
|
|
|
### 6. API Endpoints Beveiligen
|
|
|
|
Alle API endpoints in `/api/` moeten worden beveiligd:
|
|
|
|
```php
|
|
<?php
|
|
require_once __DIR__ . '/../auth/auth_functions.php';
|
|
require_once __DIR__ . '/../auth/middleware.php';
|
|
|
|
// Check authenticatie
|
|
if (!isLoggedIn()) {
|
|
http_response_code(401);
|
|
echo json_encode(['success' => false, 'error' => 'Niet geautoriseerd']);
|
|
exit;
|
|
}
|
|
|
|
// Voor write operations (POST/PUT/DELETE):
|
|
if (!hasRole('admin')) {
|
|
http_response_code(403);
|
|
echo json_encode(['success' => false, 'error' => 'Geen toegang']);
|
|
exit;
|
|
}
|
|
?>
|
|
```
|
|
|
|
**API endpoints die bescherming nodig hebben:**
|
|
- `create_transmission.php` - Admin only
|
|
- `update_transmission.php` - Admin only
|
|
- `delete_transmission.php` - Admin only
|
|
- `sync_block.php` - Admin only
|
|
- `copy_block.php` - Admin only
|
|
- `update_block_time.php` - Admin only
|
|
- `assign_color.php` - Admin only
|
|
- Read-only endpoints (`get_*.php`) - Alle ingelogde gebruikers
|
|
|
|
## Beveiliging
|
|
|
|
### Wachtwoord Beveiliging
|
|
- Gebruik `password_hash()` met `PASSWORD_BCRYPT` of `PASSWORD_ARGON2ID`
|
|
- Minimum wachtwoordlengte: 8 karakters
|
|
- Wachtwoord sterkte validatie (optioneel: hoofdletters, cijfers, speciale tekens)
|
|
|
|
### Sessie Beveiliging
|
|
- Gebruik PHP native sessions met secure settings
|
|
- Session timeout: 2 uur inactiviteit
|
|
- Regenerate session ID na login
|
|
- HttpOnly en Secure flags voor cookies (in productie)
|
|
- Session fixation bescherming
|
|
|
|
### Brute Force Bescherming
|
|
- Maximum 5 mislukte inlogpogingen per 15 minuten per username
|
|
- Maximum 10 mislukte inlogpogingen per 15 minuten per IP
|
|
- Lockout periode: 15 minuten
|
|
- Log alle inlogpogingen
|
|
|
|
### CSRF Bescherming
|
|
- CSRF tokens voor alle formulieren
|
|
- Token validatie bij POST requests
|
|
- Token regeneratie na gebruik
|
|
|
|
### SQL Injection Bescherming
|
|
- Gebruik prepared statements (reeds geïmplementeerd)
|
|
- Input validatie en sanitization
|
|
|
|
### XSS Bescherming
|
|
- Output escaping met `htmlspecialchars()` (reeds geïmplementeerd)
|
|
- Content Security Policy headers (optioneel)
|
|
|
|
## Environment Variabelen
|
|
|
|
Toevoegen aan `.env`:
|
|
|
|
```env
|
|
# Authentication Settings
|
|
AUTH_SESSION_TIMEOUT=7200
|
|
AUTH_MAX_LOGIN_ATTEMPTS=5
|
|
AUTH_LOCKOUT_DURATION=900
|
|
AUTH_REMEMBER_ME_DURATION=2592000
|
|
```
|
|
|
|
## Standaard Gebruikers
|
|
|
|
Bij installatie worden de volgende gebruikers aangemaakt:
|
|
|
|
```sql
|
|
-- Admin gebruiker
|
|
INSERT INTO users (username, email, password_hash, role) VALUES
|
|
('admin', 'admin@telvero.nl', '$2y$10$...', 'admin');
|
|
|
|
-- Guest gebruiker (voor demo)
|
|
INSERT INTO users (username, email, password_hash, role) VALUES
|
|
('guest', 'guest@telvero.nl', '$2y$10$...', 'guest');
|
|
```
|
|
|
|
**Standaard wachtwoorden:**
|
|
- Admin: `admin123` (moet bij eerste login worden gewijzigd)
|
|
- Guest: `guest123`
|
|
|
|
## UI/UX Overwegingen
|
|
|
|
### Login Pagina Design
|
|
- Centraal gepositioneerd formulier
|
|
- Telvero branding (logo, kleuren)
|
|
- Duidelijke foutmeldingen
|
|
- Loading indicator tijdens login
|
|
- Responsive design voor mobiel
|
|
|
|
### Navigatie Updates
|
|
```html
|
|
<div class="navbar-nav ms-auto">
|
|
<span class="nav-link">
|
|
<i class="bi bi-person-circle"></i>
|
|
<?= htmlspecialchars($_SESSION['user']['username']) ?>
|
|
<span class="badge bg-<?= $_SESSION['user']['role'] === 'admin' ? 'danger' : 'secondary' ?>">
|
|
<?= ucfirst($_SESSION['user']['role']) ?>
|
|
</span>
|
|
</span>
|
|
<a class="nav-link" href="auth/logout.php">
|
|
<i class="bi bi-box-arrow-right"></i> Uitloggen
|
|
</a>
|
|
</div>
|
|
```
|
|
|
|
### Guest Mode Indicators
|
|
- Toon duidelijk dat gebruiker in "alleen lezen" modus is
|
|
- Tooltip bij disabled knoppen: "Alleen admins kunnen deze actie uitvoeren"
|
|
- Optioneel: banner bovenaan pagina voor guest gebruikers
|
|
|
|
## Testing Checklist
|
|
|
|
### Authenticatie Tests
|
|
- [ ] Login met geldige credentials (admin)
|
|
- [ ] Login met geldige credentials (guest)
|
|
- [ ] Login met ongeldige credentials
|
|
- [ ] Logout functionaliteit
|
|
- [ ] Session timeout na inactiviteit
|
|
- [ ] Brute force bescherming
|
|
- [ ] "Onthoud mij" functionaliteit
|
|
- [ ] Redirect naar oorspronkelijke pagina na login
|
|
|
|
### Autorisatie Tests
|
|
- [ ] Admin kan alle pagina's bezoeken
|
|
- [ ] Guest kan alleen lezen
|
|
- [ ] Guest kan geen create/update/delete acties uitvoeren
|
|
- [ ] Guest kan niet synchroniseren met Talpa
|
|
- [ ] API endpoints zijn beveiligd
|
|
- [ ] Direct URL access wordt geblokkeerd voor ongeautoriseerde acties
|
|
|
|
### UI Tests
|
|
- [ ] Knoppen zijn verborgen/disabled voor guests
|
|
- [ ] Formulieren zijn verborgen voor guests
|
|
- [ ] Drag-and-drop is disabled voor guests
|
|
- [ ] Navigatie toont correcte gebruikersinformatie
|
|
- [ ] Rol badge wordt correct getoond
|
|
|
|
### Gebruikersbeheer Tests (Admin only)
|
|
- [ ] Admin kan gebruikers toevoegen
|
|
- [ ] Admin kan gebruikers bewerken
|
|
- [ ] Admin kan gebruikers deactiveren
|
|
- [ ] Admin kan wachtwoorden resetten
|
|
- [ ] Guest kan gebruikersbeheer niet benaderen
|
|
|
|
## Migratie Strategie
|
|
|
|
### Stap 1: Database Migratie
|
|
```bash
|
|
mysql -u username -p talpa_planning < migrations/003_add_authentication.sql
|
|
```
|
|
|
|
### Stap 2: Standaard Gebruikers Aanmaken
|
|
Via SQL of via setup script
|
|
|
|
### Stap 3: Bestaande Pagina's Updaten
|
|
Alle PHP bestanden updaten met authenticatie checks
|
|
|
|
### Stap 4: Testing
|
|
Uitgebreid testen van alle functionaliteiten
|
|
|
|
### Stap 5: Deployment
|
|
- Backup maken van database
|
|
- Code deployen
|
|
- Migratie uitvoeren
|
|
- Testen in productie
|
|
|
|
## Toekomstige Uitbreidingen
|
|
|
|
Mogelijke uitbreidingen voor de toekomst:
|
|
|
|
1. **Meer Rollen:**
|
|
- Editor: Kan plannen maar niet synchroniseren
|
|
- Viewer: Alleen lezen (zoals guest)
|
|
- Manager: Kan alles behalve gebruikersbeheer
|
|
|
|
2. **Granulaire Rechten:**
|
|
- Per module rechten toewijzen
|
|
- Custom permission sets
|
|
|
|
3. **Two-Factor Authentication (2FA):**
|
|
- TOTP via Google Authenticator
|
|
- SMS verificatie
|
|
|
|
4. **Audit Log:**
|
|
- Log alle acties van gebruikers
|
|
- Wie heeft wat wanneer gedaan
|
|
|
|
5. **Wachtwoord Beleid:**
|
|
- Wachtwoord expiratie
|
|
- Wachtwoord geschiedenis
|
|
- Complexiteitseisen
|
|
|
|
6. **Single Sign-On (SSO):**
|
|
- LDAP/Active Directory integratie
|
|
- OAuth2 providers (Google, Microsoft)
|
|
|
|
7. **API Keys:**
|
|
- Voor externe integraties
|
|
- Rate limiting
|
|
|
|
## Documentatie Updates
|
|
|
|
Na implementatie moeten de volgende documenten worden bijgewerkt:
|
|
|
|
1. **README.md:**
|
|
- Sectie over authenticatie toevoegen
|
|
- Standaard credentials documenteren
|
|
- Gebruikersbeheer uitleggen
|
|
|
|
2. **INSTALLATION.md:**
|
|
- Authenticatie migratie stappen
|
|
- Eerste admin gebruiker aanmaken
|
|
|
|
3. **Nieuwe documentatie:**
|
|
- `docs/AUTHENTICATION.md` - Uitgebreide authenticatie documentatie
|
|
- `docs/USER_MANAGEMENT.md` - Gebruikersbeheer handleiding
|
|
|
|
## Mermaid Diagram: Authenticatie Flow
|
|
|
|
```mermaid
|
|
graph TD
|
|
A[Gebruiker bezoekt pagina] --> B{Ingelogd?}
|
|
B -->|Nee| C[Redirect naar login.php]
|
|
C --> D[Gebruiker vult credentials in]
|
|
D --> E{Credentials geldig?}
|
|
E -->|Nee| F[Toon foutmelding]
|
|
F --> G{Max pogingen bereikt?}
|
|
G -->|Ja| H[Account tijdelijk geblokkeerd]
|
|
G -->|Nee| D
|
|
E -->|Ja| I[Maak sessie aan]
|
|
I --> J[Redirect naar oorspronkelijke pagina]
|
|
B -->|Ja| K{Juiste rol?}
|
|
K -->|Nee| L[Toon 403 Forbidden]
|
|
K -->|Ja| M{Admin of Guest?}
|
|
M -->|Admin| N[Volledige toegang]
|
|
M -->|Guest| O[Alleen lezen toegang]
|
|
N --> P[Toon alle functionaliteit]
|
|
O --> Q[Verberg write acties]
|
|
```
|
|
|
|
## Mermaid Diagram: Database Schema
|
|
|
|
```mermaid
|
|
erDiagram
|
|
users ||--o{ sessions : has
|
|
users ||--o{ login_attempts : has
|
|
|
|
users {
|
|
int id PK
|
|
varchar username UK
|
|
varchar email UK
|
|
varchar password_hash
|
|
enum role
|
|
boolean is_active
|
|
timestamp last_login
|
|
timestamp created_at
|
|
timestamp updated_at
|
|
}
|
|
|
|
sessions {
|
|
varchar id PK
|
|
int user_id FK
|
|
varchar ip_address
|
|
varchar user_agent
|
|
timestamp last_activity
|
|
timestamp created_at
|
|
}
|
|
|
|
login_attempts {
|
|
int id PK
|
|
varchar username
|
|
varchar ip_address
|
|
boolean success
|
|
timestamp attempted_at
|
|
}
|
|
```
|
|
|
|
## Prioriteit & Volgorde
|
|
|
|
### Fase 1: Basis Authenticatie (Hoge Prioriteit)
|
|
1. Database migratie
|
|
2. Authenticatie functies
|
|
3. Login pagina
|
|
4. Logout functionaliteit
|
|
5. Sessie management
|
|
|
|
### Fase 2: Autorisatie (Hoge Prioriteit)
|
|
1. Middleware implementatie
|
|
2. Rol checks in bestaande pagina's
|
|
3. API beveiliging
|
|
|
|
### Fase 3: UI Aanpassingen (Gemiddelde Prioriteit)
|
|
1. Navigatie updates
|
|
2. Guest mode UI restrictions
|
|
3. Tooltips en indicators
|
|
|
|
### Fase 4: Gebruikersbeheer (Gemiddelde Prioriteit)
|
|
1. Gebruikersbeheer interface
|
|
2. CRUD operaties voor gebruikers
|
|
3. Wachtwoord reset functionaliteit
|
|
|
|
### Fase 5: Extra Beveiliging (Lage Prioriteit)
|
|
1. Brute force bescherming
|
|
2. CSRF tokens
|
|
3. Audit logging
|
|
|
|
## Conclusie
|
|
|
|
Dit plan biedt een complete oplossing voor authenticatie en autorisatie in de Telvero Talpa Planning applicatie. De implementatie zorgt voor:
|
|
|
|
- **Veilige authenticatie** met moderne best practices
|
|
- **Duidelijke rolscheiding** tussen admin en guest
|
|
- **Gebruiksvriendelijke interface** met duidelijke feedback
|
|
- **Uitbreidbaarheid** voor toekomstige requirements
|
|
- **Minimale impact** op bestaande functionaliteit
|
|
|
|
De implementatie kan gefaseerd worden uitgevoerd, waarbij eerst de basis authenticatie wordt geïmplementeerd en daarna stapsgewijs de autorisatie en UI aanpassingen worden toegevoegd.
|