Sistema completo de autenticación y autorización con PHP, implementando las mejores prácticas de seguridad y patrones de diseño orientados a objetos. Incluye JWT para APIs y Docker para deployment automático.
# Opción 1: Usando Make (Recomendado)
make install && make dev
# Opción 2: Docker Compose
cp .env.docker .env && docker-compose --profile dev up -d
# Opción 3: Script de desarrollo
./scripts/dev-start.shAcceder: http://localhost:8080 phpMyAdmin: http://localhost:8081 API Health: http://localhost:8080/api.php?path=health
📖 Documentación:
- DOCKER.md - Guía completa de Docker
- JWT.md - Guía de JWT/API
- SECURITY.md - Guía de seguridad
- INSTALL.md - Instalación manual
- Hasheo de Contraseñas: Argon2ID con configuración personalizable
- JWT Authentication: Tokens stateless para APIs sin dependencias externas
- Protección CSRF: Tokens únicos por sesión
- Protección XSS: Sanitización de todas las entradas
- Protección SQL Injection: Prepared Statements en todas las consultas
- Rate Limiting: Límite de peticiones por IP
- Session Security: Regeneración de ID, validación de User-Agent
- Headers de Seguridad: CSP, X-Frame-Options, X-XSS-Protection, etc.
- Login y Registro de usuarios
- Recuperación de contraseña con tokens seguros
- Dashboard con información del usuario
- Sistema RBAC (Role-Based Access Control)
- Gestión de permisos granular
- API REST con endpoints protegidos por JWT
- Refresh tokens para renovación automática
- Validación frontend y backend
- Diseño responsive y moderno
- Docker: Deployment con un comando
- CI/CD: GitHub Actions configurado
- Singleton: Conexión a base de datos
- Repository Pattern: Abstracción de acceso a datos
- Strategy Pattern: Servicios de autenticación y autorización
- Middleware Pattern: Pipeline de seguridad
- MVC: Separación de lógica, presentación y datos
- Dependency Injection: En controladores y servicios
- Factory Pattern: Creación de objetos
- Decorator Pattern: Enriquecimiento de funcionalidad
pagina/
├── config.php # Configuración de la aplicación
├── autoload.php # PSR-4 Autoloader
├── README.md # Este archivo
├── database/
│ └── schema.sql # Schema de base de datos
├── src/
│ ├── Config/
│ │ └── Database.php # Singleton de DB
│ ├── Models/
│ │ └── User.php # Modelo de usuario
│ ├── Repositories/
│ │ ├── BaseRepository.php # Repository base
│ │ ├── UserRepository.php # Repository de usuarios
│ │ ├── RoleRepository.php # Repository de roles
│ │ └── PermissionRepository.php# Repository de permisos
│ ├── Services/
│ │ ├── AuthService.php # Servicio de autenticación
│ │ ├── AuthorizationService.php# Servicio de autorización
│ │ └── SecurityService.php # Servicio de seguridad
│ ├── Controllers/
│ │ ├── BaseController.php # Controlador base
│ │ ├── AuthController.php # Controlador de auth
│ │ ├── DashboardController.php # Controlador dashboard
│ │ └── ApiController.php # Controlador API
│ ├── Middleware/
│ │ ├── Middleware.php # Interface
│ │ ├── CsrfMiddleware.php # Protección CSRF
│ │ ├── AuthMiddleware.php # Verificación auth
│ │ └── RateLimitMiddleware.php # Rate limiting
│ ├── Validators/
│ │ └── Validator.php # Sistema de validación
│ └── Utils/ # Utilidades
├── views/
│ ├── layouts/
│ │ ├── header.php # Header HTML
│ │ └── footer.php # Footer HTML
│ ├── auth/
│ │ ├── login.php # Vista login
│ │ ├── register.php # Vista registro
│ │ ├── forgot-password.php # Vista recuperación
│ │ └── reset-password.php # Vista reset
│ └── dashboard/
│ ├── index.php # Dashboard principal
│ └── profile.php # Perfil de usuario
└── public/
├── index.php # Punto de entrada
├── login.php # Login
├── register.php # Registro
├── logout.php # Cerrar sesión
├── forgot-password.php # Recuperar contraseña
├── reset-password.php # Resetear contraseña
├── dashboard.php # Dashboard
├── api.php # Router API
├── css/
│ ├── main.css # Estilos principales
│ └── forms.css # Estilos de formularios
├── js/
│ ├── main.js # JavaScript principal
│ └── validation.js # Validación frontend
└── assets/ # Recursos estáticos
- PHP 8.0 o superior
- MySQL 5.7 o superior
- Extensiones PHP: PDO, PDO_MySQL, OpenSSL
- Servidor web (Apache/Nginx)
- Clonar o descargar el proyecto
cd c:\Users\Alumno\Desktop\pagina- Configurar la base de datos
# Importar el schema SQL
mysql -u root -p < database/schema.sql- Configurar la aplicación
Editar config.php con tus credenciales:
'database' => [
'host' => 'localhost',
'dbname' => 'secure_app_db',
'username' => 'tu_usuario',
'password' => 'tu_contraseña',
],- Configurar permisos
# En Linux/Mac
chmod -R 755 public/
chmod -R 775 logs/
# Asegurarse que el servidor web tenga acceso
chown -R www-data:www-data .- Configurar el servidor web
Apache (.htaccess en public/):
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]Nginx:
location / {
try_files $uri $uri/ /index.php?$query_string;
}- Acceder a la aplicación
http://localhost/public/
- Email: admin@example.com
- Contraseña: Admin123!
- Email: user@example.com
- Contraseña: Password123!
- Email: moderator@example.com
- Contraseña: Password123!
La API REST está disponible en /api.php?path={endpoint}
GET /api.php?path=healthGET /api.php?path=me
Headers: Cookie (sesión autenticada)GET /api.php?path=users&limit=50&offset=0
Headers: Cookie (sesión autenticada)GET /api.php?path=user&id=1
Headers: Cookie (sesión autenticada)POST /api.php?path=profile
Headers:
Cookie (sesión autenticada)
Content-Type: application/json
Body: {
"name": "Nuevo Nombre",
"csrf_token": "token_csrf"
}POST /api.php?path=change-password
Headers:
Cookie (sesión autenticada)
Content-Type: application/json
Body: {
"current_password": "actual",
"new_password": "nueva",
"confirm_password": "nueva",
"csrf_token": "token_csrf"
}- admin: Acceso total al sistema
- moderator: Permisos intermedios
- user: Permisos básicos
users.view,users.create,users.edit,users.deleteroles.view,roles.create,roles.edit,roles.deletecontent.view,content.create,content.edit,content.delete,content.publishsettings.view,settings.edit
use App\Services\AuthorizationService;
$authService = new AuthorizationService();
$user = $authService->getCurrentUser();
// Verificar rol
if ($authService->hasRole($user, 'admin')) {
// Código solo para admin
}
// Verificar permiso
if ($authService->hasPermission($user, 'users.delete')) {
// Código para quien tiene permiso de eliminar usuarios
}- SQL Injection: Todos los queries usan prepared statements
- XSS: Sanitización con
htmlspecialchars()y validación de entrada - CSRF: Tokens únicos por sesión verificados en cada POST
- Session Fixation: Regeneración de ID en login y periódicamente
- Brute Force: Rate limiting y lockout después de intentos fallidos
- Password Security: Argon2ID con salt automático
En config.php, cambiar:
'app' => [
'env' => 'production',
'debug' => false,
],
// En servidor web, activar:
ini_set('session.cookie_secure', 1); // Requiere HTTPSEl sistema establece automáticamente:
X-Frame-Options: DENYX-Content-Type-Options: nosniffX-XSS-Protection: 1; mode=blockContent-Security-PolicyReferrer-Policy: strict-origin-when-cross-origin
- Validación en tiempo real
- Feedback visual inmediato
- Prevención de envío con datos inválidos
- Validación robusta en servidor
- Sanitización de todas las entradas
- Mensajes de error descriptivos
- Crear método en
ApiController.php - Agregar ruta en
public/api.php - Aplicar middleware necesario
- Documentar en README
INSERT INTO permissions (name, description) VALUES
('new.permission', 'Descripción del permiso');
-- Asignar a un rol
INSERT INTO role_permissions (role_id, permission_id)
VALUES (1, LAST_INSERT_ID());- Crear archivo PHP en
views/ - Extender desde layouts
- Crear controlador si es necesario
- Agregar archivo público en
public/
- Backend: PHP 8+ con POO
- Base de Datos: MySQL con InnoDB
- Frontend: HTML5, CSS3, JavaScript ES6+
- Seguridad: Argon2ID, CSRF Tokens, Rate Limiting
- Arquitectura: MVC, Repository Pattern, Middleware
Este proyecto es de código abierto para fines educativos.
Para problemas o preguntas, crear un issue en el repositorio del proyecto.
Desarrollado siguiendo las mejores prácticas de OWASP y estándares de la industria.