package nl.connectedit.swiss.authentication; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.boot.autoconfigure.condition.ConditionalOnExpression; import org.springframework.context.annotation.Profile; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.BadCredentialsException; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.web.bind.annotation.CrossOrigin; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.server.ResponseStatusException; @RestController @ConditionalOnExpression("${security}") @RequiredArgsConstructor @CrossOrigin public class AuthenticationController { private final JwtUserDetailsService jwtUserDetailsService; private final AuthenticationManager authenticationManager; private final JwtTokenService jwtTokenService; @PostMapping("/authenticate") public AuthenticationResponse authenticate(@RequestBody @Valid final AuthenticationRequest authenticationRequest) { try { authenticationManager.authenticate(new UsernamePasswordAuthenticationToken( authenticationRequest.getUsername(), authenticationRequest.getPassword())); } catch (final BadCredentialsException ex) { throw new ResponseStatusException(HttpStatus.UNAUTHORIZED); } final UserDetails userDetails = jwtUserDetailsService.loadUserByUsername(authenticationRequest.getUsername()); final AuthenticationResponse authenticationResponse = new AuthenticationResponse(); authenticationResponse.setAccessToken(jwtTokenService.generateToken(userDetails)); authenticationResponse.setUsername(authenticationRequest.getUsername()); return authenticationResponse; } }