AuthService.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. package it.bgates.remotebe.service.auth;
  2. import com.fasterxml.jackson.databind.ObjectMapper;
  3. import it.bgates.remotebe.config.BGatesUserDetailService;
  4. import it.bgates.remotebe.config.BGatesUserDetails;
  5. import it.bgates.remotebe.config.JwtService;
  6. import it.bgates.remotebe.controller.auth.beans.AuthenticationRequest;
  7. import it.bgates.remotebe.controller.auth.beans.AuthenticationResponse;
  8. import it.bgates.remotebe.controller.auth.beans.RefreshTokenRequest;
  9. import it.bgates.remotebe.entities.Role;
  10. import it.bgates.remotebe.entities.User;
  11. import it.bgates.remotebe.entities.token.RefreshToken;
  12. import it.bgates.remotebe.entities.token.Token;
  13. import it.bgates.remotebe.entities.token.TokenRepository;
  14. import it.bgates.remotebe.exception.AutorizationMissingException;
  15. import it.bgates.remotebe.exception.DisabledUserException;
  16. import it.bgates.remotebe.exception.UserNotFoundException;
  17. import it.bgates.remotebe.service.UserService;
  18. import jakarta.servlet.http.HttpServletRequest;
  19. import jakarta.servlet.http.HttpServletResponse;
  20. import jakarta.validation.Valid;
  21. import lombok.RequiredArgsConstructor;
  22. import org.springframework.http.HttpHeaders;
  23. import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
  24. import org.springframework.security.core.Authentication;
  25. import org.springframework.security.core.AuthenticationException;
  26. import org.springframework.security.core.authority.AuthorityUtils;
  27. import org.springframework.security.core.context.SecurityContextHolder;
  28. import org.springframework.security.core.userdetails.UserDetails;
  29. import org.springframework.security.core.userdetails.UsernameNotFoundException;
  30. import org.springframework.security.oauth2.jwt.Jwt;
  31. import org.springframework.stereotype.Service;
  32. import java.io.IOException;
  33. import java.security.Principal;
  34. import java.time.Instant;
  35. import java.util.ArrayList;
  36. import java.util.List;
  37. import java.util.Optional;
  38. import java.util.stream.Collectors;
  39. @Service
  40. @RequiredArgsConstructor
  41. public class AuthService {
  42. private final BGatesUserDetailService authenticationProvider;
  43. private final JwtService jwtService;
  44. private final BGatesUserDetailService userDetailsService;
  45. private final TokenRepository tokenRepository;
  46. private final RefreshTokenService refreshTokenService;
  47. private final UserService userService;
  48. /***
  49. *
  50. * @param request (username, password)
  51. * @return AuthenticationResponse con dettagli per l'autenticazione
  52. * accessToken, refreshToken, expirationTime, ...
  53. */
  54. public AuthenticationResponse authenticate(AuthenticationRequest request)
  55. throws AuthenticationException, DisabledUserException, UserNotFoundException {
  56. Authentication authentication = authenticationProvider.authenticate(
  57. new UsernamePasswordAuthenticationToken(
  58. request.getUsername(),
  59. request.getPassword()
  60. )
  61. );
  62. // recupera utente
  63. UserDetails userDetails = (UserDetails) authentication.getPrincipal();
  64. Optional<User> user = userService.findByUsername(userDetails.getUsername());
  65. if (user.isEmpty()) {
  66. throw new UserNotFoundException("User not found");
  67. }
  68. if (!user.get().getEnabled()) {
  69. throw new DisabledUserException("User not enabled");
  70. }
  71. var jwtToken = jwtService.generateToken(userDetails);
  72. var refreshToken = jwtService.generateRefreshToken(userDetails);
  73. revokeAllUserTokens(userDetails);
  74. saveUserToken(userDetails, jwtToken);
  75. List<String> roles = user.get().getRoles().stream()
  76. .map(Role::getName)
  77. .collect(Collectors.toList());
  78. List<String> authorities = new ArrayList<>();
  79. for (Role role: user.get().getRoles()) {
  80. role.getPrivileges().forEach(privilege -> authorities.add(privilege.getName()));
  81. }
  82. return AuthenticationResponse.builder()
  83. .accessToken(jwtToken)
  84. .refreshToken(refreshToken)
  85. .username(userDetails.getUsername())
  86. .authorities(authorities)
  87. .roles(roles)
  88. .build();
  89. }
  90. /***
  91. * Logout user
  92. * @param name
  93. */
  94. public void logout(String name) {
  95. tokenRepository.findAllValidTokenByUser(name).forEach(token -> {
  96. token.setRevoked(true);
  97. token.setExpired(true);
  98. tokenRepository.save(token);
  99. });
  100. }
  101. private void saveUserToken(UserDetails user, String jwtToken) {
  102. var token = Token.builder()
  103. .username(user.getUsername())
  104. .token(jwtToken)
  105. .expired(false)
  106. .revoked(false)
  107. .build();
  108. tokenRepository.save(token);
  109. }
  110. private void revokeAllUserTokens(UserDetails user) {
  111. var validUserTokens = tokenRepository.findAllValidTokenByUser(user.getUsername());
  112. if (validUserTokens.isEmpty())
  113. return;
  114. validUserTokens.forEach(token -> {
  115. token.setExpired(true);
  116. token.setRevoked(true);
  117. });
  118. tokenRepository.saveAll(validUserTokens);
  119. }
  120. public void refreshToken(
  121. HttpServletRequest request,
  122. HttpServletResponse response
  123. ) throws IOException {
  124. final String authHeader = request.getHeader(HttpHeaders.AUTHORIZATION);
  125. final String refreshToken;
  126. final String username;
  127. if (authHeader == null ||!authHeader.startsWith("Bearer ")) {
  128. return;
  129. }
  130. refreshToken = authHeader.substring(7);
  131. username = jwtService.extractUsername(refreshToken);
  132. if (username != null) {
  133. BGatesUserDetails userDetails = userDetailsService.loadUserByUsername(username);
  134. if (jwtService.isTokenValid(refreshToken, userDetails)) {
  135. var accessToken = jwtService.generateToken(userDetails);
  136. revokeAllUserTokens(userDetails);
  137. saveUserToken(userDetails, accessToken);
  138. var authResponse = AuthenticationResponse.builder()
  139. .accessToken(accessToken)
  140. .refreshToken(refreshToken)
  141. .username(username)
  142. .build();
  143. new ObjectMapper().writeValue(response.getOutputStream(), authResponse);
  144. }
  145. }
  146. }
  147. @org.springframework.transaction.annotation.Transactional(readOnly = true)
  148. public BGatesUserDetails getCurrentUser() {
  149. // System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal());
  150. BGatesUserDetails principal = (BGatesUserDetails) SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  151. return userDetailsService.loadUserByUsername(principal.getUsername());
  152. }
  153. }