Estoy usando en mi proyecto ForoHub JWT, pero al realizar mi solicitud del login en Insomnia me resulta un error 403.
package com.foro.infra.security;
import...
@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
@Autowired
private SecurityFilter securityFilter;
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
return http
.csrf(csrf ->csrf.disable())
.sessionManagement(sm -> sm.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
.authorizeHttpRequests(req -> {
req.requestMatchers(HttpMethod.POST, "/login").permitAll();
req.anyRequest().authenticated();
})
.addFilterBefore(securityFilter, UsernamePasswordAuthenticationFilter.class)
.build();
}
@Bean
public AuthenticationManager authenticationManager (AuthenticationConfiguration configuration) throws Exception {
return configuration.getAuthenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}
}
package com.foro.infra.security;
import...
@Service
public class TokenService {
@Value("${api.security.secret}")
private String apiSecret;
private SecretKey getKey() {
return Keys.hmacShaKeyFor(apiSecret.getBytes(StandardCharsets.UTF_8));
}
public String generarToken(Usuario usuario) {
return Jwts.builder()
.setSubject(usuario.getCorreoElectronico())
.setIssuedAt(new Date())
.setExpiration(Date.from(Instant.now().plus(2, ChronoUnit.HOURS)))
.signWith(getKey(), SignatureAlgorithm.HS256)
.compact();
}
public String getSubject(String token) {
if (token == null) throw new RuntimeException("Token vacío");
return Jwts.parserBuilder()
.setSigningKey(getKey())
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
import...
@Component
public class SecurityFilter extends OncePerRequestFilter {
@Autowired
private TokenService tokenService;
@Autowired
private UsuarioRepository repository;
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
String tokenJWT = recuperarToken(request);
if (tokenJWT != null) {
String correo = tokenService.getSubject(tokenJWT);
var optionalUsuario = repository.findByCorreoElectronico(correo);
if (correo != null && optionalUsuario.isPresent()) {
var usuario = optionalUsuario.get();
var auth = new UsernamePasswordAuthenticationToken(
usuario, null, usuario.getAuthorities()
);
SecurityContextHolder.getContext().setAuthentication(auth);
}
}
filterChain.doFilter(request, response);
}
private String recuperarToken(HttpServletRequest request) {
String authHeader = request.getHeader("Authorization");
if (authHeader != null && authHeader.startsWith("Bearer ")) {
return authHeader.replace("Bearer ", "");
}
return null;
}
}