552 lines
14 KiB
Markdown
552 lines
14 KiB
Markdown
# Authentication and Authorization Specification
|
|
|
|
## Overview
|
|
|
|
Comprehensive authentication and authorization system using Laravel Sanctum for API authentication and Filament for admin panel access control, with role-based permissions and security best practices.
|
|
|
|
## Authentication Architecture
|
|
|
|
### Laravel Sanctum Integration
|
|
|
|
**Purpose**: Provides API authentication for SPA applications
|
|
|
|
**Token Management**:
|
|
- **Token Storage**: Database storage with automatic expiration
|
|
- **Token Types**: Personal access tokens with configurable abilities
|
|
- **Security**: CSRF protection and secure token generation
|
|
|
|
**Frontend Integration**:
|
|
```javascript
|
|
// Login process
|
|
axios.post('/login', credentials)
|
|
.then(response => {
|
|
// Store token securely
|
|
localStorage.setItem('api_token', response.data.token);
|
|
// Set default authorization header
|
|
axios.defaults.headers.common['Authorization'] = `Bearer ${response.data.token}`;
|
|
});
|
|
```
|
|
|
|
### Session-Based Authentication
|
|
|
|
**Purpose**: Traditional web session management for admin panel
|
|
|
|
**Implementation**:
|
|
- Laravel Breeze scaffolding for basic auth
|
|
- Session cookies for state management
|
|
- CSRF protection for form submissions
|
|
|
|
## User Model and Roles
|
|
|
|
### User Model
|
|
|
|
**Location**: `app/Models/User.php`
|
|
|
|
**Key Attributes**:
|
|
```php
|
|
// Authentication
|
|
email: string (unique) // Primary login identifier
|
|
password: string (hashed) // Secure password hash
|
|
email_verified_at: timestamp // Email verification status
|
|
|
|
// Authorization
|
|
role_id: bigint unsigned (nullable) // Foreign key to roles table
|
|
|
|
// Two-Factor Authentication
|
|
two_factor_secret: text (nullable) // TOTP secret key
|
|
two_factor_recovery_codes: text (nullable) // Backup recovery codes
|
|
two_factor_confirmed_at: timestamp (nullable) // 2FA confirmation
|
|
|
|
// Preferences
|
|
email_notifications_enabled: boolean (default: true) // Notification preferences
|
|
theme_preference: string (default: 'light') // UI theme
|
|
locale: string (default: 'en') // Language preference
|
|
```
|
|
|
|
### Role-Based Access Control
|
|
|
|
**Role Model**:
|
|
```php
|
|
// Simple role system
|
|
id: bigint unsigned auto_increment primary key
|
|
name: varchar(255) unique // Role identifier ('admin', 'user')
|
|
created_at, updated_at: timestamps
|
|
```
|
|
|
|
**Predefined Roles**:
|
|
- **admin**: Full system access, user management, configuration
|
|
- **user**: Standard user access, personal gallery management
|
|
|
|
**Role Assignment**:
|
|
```php
|
|
// Default role assignment (in migration)
|
|
$usersTable->foreignId('role_id')->constrained()->default(2); // Defaults to 'user' role
|
|
|
|
// Role checking
|
|
$user->role->name === 'admin'
|
|
$user->role?->name === 'admin' // Safe null checking
|
|
```
|
|
|
|
## Authorization Mechanisms
|
|
|
|
### API Authorization
|
|
|
|
**Protected Routes**:
|
|
```php
|
|
// routes/api.php
|
|
Route::middleware('auth:sanctum')->group(function () {
|
|
Route::post('/api/images/keep', [ImageController::class, 'keepImage']);
|
|
Route::delete('/api/images/{image}', [ImageController::class, 'deleteImage']);
|
|
Route::get('/api/user', function (Request $request) {
|
|
return $request->user();
|
|
});
|
|
});
|
|
```
|
|
|
|
**Middleware Stack**:
|
|
1. **auth:sanctum**: Validates bearer token
|
|
2. **Custom Logic**: Additional business rule validation
|
|
|
|
### Admin Panel Authorization
|
|
|
|
**Filament Integration**:
|
|
- Built-in authentication for `/admin` routes
|
|
- Session-based admin access
|
|
- Automatic logout on inactivity
|
|
|
|
**Access Control**:
|
|
```php
|
|
// Filament panel configuration
|
|
->requirePasswordResetAfterLogin(false)
|
|
->passwordReset()
|
|
->emailVerification()
|
|
->twoFactorAuthentication()
|
|
```
|
|
|
|
## Security Measures
|
|
|
|
### Password Security
|
|
|
|
**Hashing Algorithm**:
|
|
- Laravel default: bcrypt with cost factor 12
|
|
- Future migration path to Argon2
|
|
|
|
**Password Requirements**:
|
|
- Minimum 8 characters
|
|
- Mixed case letters
|
|
- Numbers and special characters
|
|
- Not in common password lists
|
|
|
|
### Two-Factor Authentication
|
|
|
|
**Implementation**:
|
|
- TOTP (Time-based One-Time Password) standard
|
|
- Google Authenticator, Authy compatibility
|
|
- Recovery codes for account recovery
|
|
|
|
**Setup Flow**:
|
|
1. User enables 2FA in profile settings
|
|
2. QR code generated for authenticator app
|
|
3. User confirms setup with first TOTP code
|
|
4. Recovery codes generated and displayed once
|
|
|
|
**Verification**:
|
|
```php
|
|
// Middleware for 2FA verification
|
|
if ($user->two_factor_secret && !$user->two_factor_confirmed_at) {
|
|
return redirect()->route('two-factor.challenge');
|
|
}
|
|
```
|
|
|
|
### Session Security
|
|
|
|
**Configuration**:
|
|
```php
|
|
// config/session.php
|
|
'secure' => env('SESSION_SECURE_COOKIE', true), // HTTPS only
|
|
'http_only' => true, // Prevent XSS access
|
|
'same_site' => 'lax', // CSRF protection
|
|
'expire_on_close' => false, // Persistent sessions
|
|
'lifetime' => 120, // 2 hour timeout
|
|
```
|
|
|
|
**Admin Session Management**:
|
|
- Shorter session lifetime for admin users
|
|
- Automatic logout on suspicious activity
|
|
- Session fixation protection
|
|
|
|
## Permission System
|
|
|
|
### Image Ownership
|
|
|
|
**Business Rules**:
|
|
- Users can only modify their own images
|
|
- Temporary images are tied to processing session
|
|
- Public images visible to all authenticated users
|
|
|
|
**Implementation**:
|
|
```php
|
|
// ImageController@deleteImage
|
|
public function deleteImage(Image $image)
|
|
{
|
|
// Implicit authorization via route model binding
|
|
// User must own the image or be admin
|
|
$this->authorize('delete', $image);
|
|
// or explicit check
|
|
if ($image->user_id !== auth()->id() && !auth()->user()->isAdmin()) {
|
|
abort(403);
|
|
}
|
|
}
|
|
```
|
|
|
|
### Admin Permissions
|
|
|
|
**Admin-Only Operations**:
|
|
- User management (create, edit, delete users)
|
|
- System configuration changes
|
|
- Plugin and API provider management
|
|
- Style and AI model configuration
|
|
- Application settings modification
|
|
|
|
**Permission Checking**:
|
|
```php
|
|
// Policy-based authorization
|
|
class ImagePolicy
|
|
{
|
|
public function delete(User $user, Image $image): bool
|
|
{
|
|
return $user->id === $image->user_id || $user->role->name === 'admin';
|
|
}
|
|
}
|
|
|
|
// Controller usage
|
|
$this->authorize('delete', $image);
|
|
```
|
|
|
|
## Security Headers and CSRF Protection
|
|
|
|
### Security Headers
|
|
|
|
**Content Security Policy**:
|
|
```php
|
|
// app/Http/Middleware/SetContentSecurityPolicy.php
|
|
$contentSecurityPolicy = [
|
|
'default-src' => ['self'],
|
|
'script-src' => ['self', 'unsafe-inline', 'unsafe-eval'],
|
|
'style-src' => ['self', 'unsafe-inline'],
|
|
'img-src' => ['self', 'data:', 'https:'],
|
|
'connect-src' => ['self', 'ws:', 'wss:'],
|
|
];
|
|
```
|
|
|
|
**Other Security Headers**:
|
|
- `X-Frame-Options: SAMEORIGIN` - Prevent clickjacking
|
|
- `X-Content-Type-Options: nosniff` - Prevent MIME sniffing
|
|
- `Referrer-Policy: strict-origin-when-cross-origin` - Control referrer info
|
|
- `Permissions-Policy: camera=(), microphone=(), geolocation=()` - Disable unnecessary permissions
|
|
|
|
### CSRF Protection
|
|
|
|
**Laravel CSRF**:
|
|
- Automatic token generation for forms
|
|
- Middleware validation on state-changing requests
|
|
- Exception for API routes (handled by Sanctum)
|
|
|
|
**Custom CSRF**:
|
|
```php
|
|
// Verify CSRF token manually if needed
|
|
if (!hash_equals($request->session()->token(), $request->input('_token'))) {
|
|
abort(419, 'CSRF token mismatch');
|
|
}
|
|
```
|
|
|
|
## Authentication Flows
|
|
|
|
### User Registration
|
|
|
|
**Flow**:
|
|
1. User submits registration form
|
|
2. Validation (email format, password strength, uniqueness)
|
|
3. Account creation with default 'user' role
|
|
4. Email verification (if enabled)
|
|
5. Welcome email sent
|
|
|
|
**Validation Rules**:
|
|
```php
|
|
'email' => 'required|email|unique:users|max:255',
|
|
'password' => 'required|min:8|confirmed',
|
|
'name' => 'required|string|max:255',
|
|
```
|
|
|
|
### User Login
|
|
|
|
**Flow**:
|
|
1. User submits credentials
|
|
2. Rate limiting applied (5 attempts per minute)
|
|
3. Credentials verified against database
|
|
4. 2FA challenge if enabled
|
|
5. Session/token created
|
|
6. Redirect to appropriate interface
|
|
|
|
**Rate Limiting**:
|
|
```php
|
|
// Throttle login attempts
|
|
RateLimiter::tooManyAttempts($key, 5) // 5 attempts
|
|
RateLimiter::hit($key, 60) // Lock for 60 seconds
|
|
```
|
|
|
|
### Password Reset
|
|
|
|
**Secure Token Flow**:
|
|
1. User requests password reset
|
|
2. Secure token generated and emailed
|
|
3. Token validated on reset form
|
|
4. Password updated with new hash
|
|
5. Old tokens invalidated
|
|
|
|
**Token Security**:
|
|
- Cryptographically secure random tokens
|
|
- Short expiration time (1 hour)
|
|
- Single-use tokens
|
|
|
|
## Admin Authentication
|
|
|
|
### Admin Panel Access
|
|
|
|
**Route Protection**:
|
|
```php
|
|
// Admin routes protected by Filament middleware
|
|
Route::prefix('admin')->name('admin.')->middleware([
|
|
'auth:sanctum', // API authentication
|
|
// Filament middleware stack
|
|
])->group(function () {
|
|
// Admin routes
|
|
});
|
|
```
|
|
|
|
**Role-Based Access**:
|
|
- Only users with 'admin' role can access admin panel
|
|
- Automatic redirect for unauthorized users
|
|
- Session management for admin activities
|
|
|
|
### Admin User Management
|
|
|
|
**User CRUD Operations**:
|
|
- Create new users with role assignment
|
|
- Edit user details and permissions
|
|
- Disable/enable user accounts
|
|
- Reset passwords securely
|
|
|
|
**Bulk Operations**:
|
|
- Mass role assignment
|
|
- Account activation/deactivation
|
|
- Email notifications for status changes
|
|
|
|
## API Security
|
|
|
|
### Token Management
|
|
|
|
**Token Creation**:
|
|
```php
|
|
// Create personal access token
|
|
$token = $user->createToken('api-token', ['read', 'write']);
|
|
$plainTextToken = $token->plainTextToken;
|
|
```
|
|
|
|
**Token Abilities**:
|
|
- `read`: View images and styles
|
|
- `write`: Upload images and apply styles
|
|
- `admin`: Full administrative access
|
|
|
|
**Token Expiration**:
|
|
```php
|
|
// Create expiring token
|
|
$token = $user->createToken('temp-token', ['read'], now()->addHour());
|
|
```
|
|
|
|
### API Rate Limiting
|
|
|
|
**Current Implementation**: No explicit rate limiting (rely on external services)
|
|
|
|
**Recommended Limits**:
|
|
```php
|
|
// Per-user rate limits
|
|
'api:images:upload' => '5,1', // 5 uploads per minute
|
|
'api:images:style-change' => '3,1', // 3 style changes per minute
|
|
'api:admin:*' => '60,1', // 60 admin actions per minute
|
|
```
|
|
|
|
## Security Monitoring
|
|
|
|
### Audit Logging
|
|
|
|
**Authentication Events**:
|
|
- Login attempts (success/failure)
|
|
- Password changes
|
|
- 2FA setup/removal
|
|
- Role changes
|
|
- Admin actions
|
|
|
|
**Security Events**:
|
|
- Suspicious login attempts
|
|
- Multiple failed authentication attempts
|
|
- Admin privilege escalation
|
|
- API abuse detection
|
|
|
|
### Intrusion Detection
|
|
|
|
**Failed Login Monitoring**:
|
|
- Track failed attempts by IP/user
|
|
- Automatic account lockout after threshold
|
|
- Admin notification for repeated failures
|
|
|
|
**Session Monitoring**:
|
|
- Concurrent session detection
|
|
- Session hijacking prevention
|
|
- Unusual activity flagging
|
|
|
|
## Data Protection
|
|
|
|
### Password Storage
|
|
- **Algorithm**: bcrypt with configurable cost
|
|
- **Salt**: Automatic per-password salt generation
|
|
- **Upgrade Path**: Automatic rehash on successful login
|
|
|
|
### Sensitive Data
|
|
- **API Tokens**: Encrypted storage in database
|
|
- **2FA Secrets**: Encrypted TOTP secrets
|
|
- **Configuration**: Environment variables for sensitive settings
|
|
|
|
### Data Backup Security
|
|
- Encrypted database backups
|
|
- Secure backup storage locations
|
|
- Access logging for backup operations
|
|
|
|
## Compliance Considerations
|
|
|
|
### GDPR Compliance
|
|
|
|
**Data Handling**:
|
|
- User consent for data processing
|
|
- Right to data portability
|
|
- Right to be forgotten (account deletion)
|
|
- Data processing activity logs
|
|
|
|
**Privacy Features**:
|
|
- Granular privacy settings
|
|
- Data export functionality
|
|
- Secure account deletion process
|
|
|
|
### Security Standards
|
|
|
|
**OWASP Compliance**:
|
|
- Protection against common web vulnerabilities
|
|
- Secure coding practices
|
|
- Regular security assessments
|
|
|
|
**Industry Standards**:
|
|
- HTTPS enforcement
|
|
- Secure cookie handling
|
|
- Input validation and sanitization
|
|
|
|
## Future Security Enhancements
|
|
|
|
### Advanced Authentication
|
|
|
|
**OAuth Integration**:
|
|
- Social login providers (Google, GitHub)
|
|
- Single sign-on capabilities
|
|
- Third-party application access
|
|
|
|
**Biometric Authentication**:
|
|
- WebAuthn/FIDO2 support
|
|
- Hardware security key support
|
|
- Mobile authenticator integration
|
|
|
|
### Advanced Authorization
|
|
|
|
**Permission-Based Access**:
|
|
- Granular permissions beyond roles
|
|
- Resource-based permissions
|
|
- Dynamic permission assignment
|
|
|
|
**Multi-Tenancy**:
|
|
- Organization-based access control
|
|
- Team-based permissions
|
|
- Resource isolation
|
|
|
|
### Enhanced Security
|
|
|
|
**Advanced Monitoring**:
|
|
- Real-time threat detection
|
|
- Automated security responses
|
|
- Security information and event management (SIEM)
|
|
|
|
**Zero-Trust Architecture**:
|
|
- Continuous authentication
|
|
- Micro-segmentation
|
|
- Least privilege access
|
|
|
|
## Deployment Security
|
|
|
|
### Environment Security
|
|
|
|
**Development**:
|
|
- Debug mode disabled
|
|
- Verbose error reporting off
|
|
- Test credentials and data
|
|
|
|
**Production**:
|
|
- HTTPS enforcement
|
|
- Secure headers enabled
|
|
- Production credentials only
|
|
|
|
### Infrastructure Security
|
|
|
|
**Server Hardening**:
|
|
- Minimal attack surface
|
|
- Regular security updates
|
|
- Firewall configuration
|
|
|
|
**Database Security**:
|
|
- Encrypted database connections
|
|
- Minimal privilege accounts
|
|
- Regular backup testing
|
|
|
|
## Testing Security Features
|
|
|
|
### Authentication Tests
|
|
|
|
**Unit Tests**:
|
|
- Password hashing verification
|
|
- Token generation and validation
|
|
- Role assignment and checking
|
|
|
|
**Integration Tests**:
|
|
- Complete login/logout flow
|
|
- API authentication middleware
|
|
- Admin panel access control
|
|
|
|
**Security Tests**:
|
|
- SQL injection prevention
|
|
- XSS vulnerability testing
|
|
- CSRF protection validation
|
|
|
|
## Troubleshooting Security
|
|
|
|
### Common Issues
|
|
|
|
**Token Expiration**:
|
|
- Automatic token refresh mechanisms
|
|
- Graceful handling of expired sessions
|
|
- User notification and re-authentication
|
|
|
|
**Permission Errors**:
|
|
- Clear error messages for users
|
|
- Detailed logging for administrators
|
|
- Permission debugging tools
|
|
|
|
**Session Issues**:
|
|
- Session fixation protection
|
|
- Secure session handling
|
|
- Cross-site request forgery prevention |