Integrar base de datos MySQL y completar registro de usuarios

- database/schema.sql: DDL completo de las 22 tablas del proyecto MAPS Connect (3FN), con FKs, CHECK constraints, índices y 3 triggers para reglas de integridad (límite de 3 certificados, verificación docente, semestre 1-12). - Corrección de la API JJWT 0.12.x en JwtTokenProvider (parser(), verifyWith(), parseSignedClaims(), getPayload()). - Nuevo CustomUserDetailsService y bean PasswordEncoder (BCrypt) en SecurityConfig, requeridos por Spring Security. - Formulario de registro (registro.html + registro.js) implementado y conectado a POST /auth/registrar, con validación de correo institucional (@tecmilenio.mx) y contraseñas. - CorsConfig: se agregó el origen http://localhost:63342 (servidor de IntelliJ) a los orígenes permitidos. - Corrección de mapeo entidad Usuario ↔ esquema real: columnas id_usuario/ correo/contrasena_hash, tipo Integer para el id (antes Long/BigInt vs Int en BD). - application-dev.yml: ddl-auto cambiado de create-drop a validate para respetar el esquema ya creado manualmente. - @Builder.Default agregado a activo y fechaCreacion en Usuario (Lombok ignoraba los valores por defecto en el builder). - Clave secreta JWT alargada a ≥512 bits, requerido por el algoritmo HS512. Resultado: flujo completo de registro funcionando end-to-end (frontend → backend → MySQL → JWT).

dantereach committed Aug 27, 2026 at 15:37 UTC b323e56d5e3e0be3bb20db018becdca31d1df39a
1 file changed +38
src/main/java/com/tecmilenio/mapsconect/security/CustomUserDetailsService.java new
+38
@@ -0,0 +1,38 @@
1 +package com.tecmilenio.mapsconect.security;
2 +
3 +import com.tecmilenio.mapsconect.entity.Usuario;
4 +import com.tecmilenio.mapsconect.repository.UsuarioRepository;
5 +import org.springframework.beans.factory.annotation.Autowired;
6 +import org.springframework.security.core.GrantedAuthority;
7 +import org.springframework.security.core.authority.SimpleGrantedAuthority;
8 +import org.springframework.security.core.userdetails.User;
9 +import org.springframework.security.core.userdetails.UserDetails;
10 +import org.springframework.security.core.userdetails.UserDetailsService;
11 +import org.springframework.security.core.userdetails.UsernameNotFoundException;
12 +import org.springframework.stereotype.Service;
13 +
14 +import java.util.Collections;
15 +import java.util.List;
16 +
17 +@Service
18 +public class CustomUserDetailsService implements UserDetailsService {
19 +
20 + @Autowired
21 + private UsuarioRepository usuarioRepository;
22 +
23 + @Override
24 + public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException {
25 + Usuario usuario = usuarioRepository.findByEmail(email)
26 + .orElseThrow(() -> new UsernameNotFoundException("Usuario no encontrado: " + email));
27 +
28 + List<GrantedAuthority> authorities = Collections.singletonList(
29 + new SimpleGrantedAuthority("ROLE_" + usuario.getRol().name()));
30 +
31 + return new User(
32 + usuario.getEmail(),
33 + usuario.getContrasena(),
34 + usuario.getActivo(),
35 + true, true, true,
36 + authorities);
37 + }
38 +}
\ No newline at end of file