backend/src/main/java/ch/usi/inf/sa4/sanmarinoes/smarthut/controller/AuthenticationController.java

87 lines
3.6 KiB
Java
Raw Normal View History

2020-02-25 16:51:45 +00:00
package ch.usi.inf.sa4.sanmarinoes.smarthut.controller;
2020-03-15 09:44:10 +00:00
import ch.usi.inf.sa4.sanmarinoes.smarthut.config.JWTTokenUtils;
2020-02-26 20:41:54 +00:00
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.JWTRequest;
import ch.usi.inf.sa4.sanmarinoes.smarthut.dto.JWTResponse;
2020-03-05 11:42:53 +00:00
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.UnauthorizedException;
2020-03-03 09:55:35 +00:00
import ch.usi.inf.sa4.sanmarinoes.smarthut.error.UserNotFoundException;
2020-02-25 16:51:45 +00:00
import ch.usi.inf.sa4.sanmarinoes.smarthut.models.*;
import ch.usi.inf.sa4.sanmarinoes.smarthut.service.JWTUserDetailsService;
2020-03-25 21:41:59 +00:00
import java.security.Principal;
2020-02-26 20:41:54 +00:00
import javax.validation.Valid;
2020-02-25 16:51:45 +00:00
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.security.authentication.DisabledException;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/auth")
2020-02-26 20:41:54 +00:00
public class AuthenticationController {
2020-02-25 16:51:45 +00:00
2020-03-02 15:56:43 +00:00
private final AuthenticationManager authenticationManager;
2020-02-25 16:51:45 +00:00
2020-03-02 15:56:43 +00:00
private final UserRepository userRepository;
2020-02-26 20:41:54 +00:00
2020-03-15 09:44:10 +00:00
private final JWTTokenUtils jwtTokenUtils;
2020-02-25 16:51:45 +00:00
2020-03-02 15:56:43 +00:00
private final JWTUserDetailsService userDetailsService;
2020-02-25 16:51:45 +00:00
2020-03-02 15:56:43 +00:00
public AuthenticationController(
AuthenticationManager authenticationManager,
UserRepository userRepository,
2020-03-15 09:44:10 +00:00
JWTTokenUtils jwtTokenUtils,
2020-03-03 09:55:35 +00:00
JWTUserDetailsService userDetailsService) {
2020-03-02 15:56:43 +00:00
this.authenticationManager = authenticationManager;
this.userRepository = userRepository;
2020-03-15 09:44:10 +00:00
this.jwtTokenUtils = jwtTokenUtils;
2020-03-02 15:56:43 +00:00
this.userDetailsService = userDetailsService;
}
2020-02-25 16:51:45 +00:00
@PostMapping("/login")
2020-03-04 12:28:51 +00:00
public JWTResponse login(@Valid @RequestBody JWTRequest authenticationRequest)
2020-03-05 11:42:53 +00:00
throws UnauthorizedException, UserNotFoundException {
2020-03-04 14:11:23 +00:00
final UserDetails userDetails;
2020-03-03 09:55:35 +00:00
if (authenticationRequest.getUsernameOrEmail().contains("@")) {
// usernameOrEmail contains an email, so fetch the corresponding username
final User user =
userRepository.findByEmailIgnoreCase(
authenticationRequest.getUsernameOrEmail());
if (user == null) {
throw new UserNotFoundException();
}
authenticate(user.getUsername(), authenticationRequest.getPassword());
2020-03-04 14:11:23 +00:00
userDetails = userDetailsService.loadUserByUsername(user.getUsername());
2020-03-03 09:55:35 +00:00
} else {
// usernameOrEmail contains a username, authenticate with that then
authenticate(
authenticationRequest.getUsernameOrEmail(),
authenticationRequest.getPassword());
userDetails =
userDetailsService.loadUserByUsername(
authenticationRequest.getUsernameOrEmail());
2020-03-03 09:55:35 +00:00
}
2020-03-15 09:44:10 +00:00
final String token = jwtTokenUtils.generateToken(userDetails);
2020-02-25 16:51:45 +00:00
return new JWTResponse(token);
}
2020-03-25 21:41:59 +00:00
@GetMapping("/profile")
public User profile(final Principal principal) {
return userRepository.findByUsername(principal.getName());
}
2020-03-05 11:42:53 +00:00
private void authenticate(String username, String password) throws UnauthorizedException {
2020-02-25 16:51:45 +00:00
try {
authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(username, password));
} catch (DisabledException e) {
throw new UnauthorizedException(true, e);
2020-02-25 16:51:45 +00:00
} catch (BadCredentialsException e) {
throw new UnauthorizedException(false, e);
2020-02-25 16:51:45 +00:00
}
}
}