|
| 1 | +package com.bookstore.api.controllers; |
| 2 | + |
| 3 | +import java.util.List; |
| 4 | + |
| 5 | +import org.springframework.http.HttpStatus; |
| 6 | +import org.springframework.http.ResponseEntity; |
| 7 | +import org.springframework.security.access.prepost.PreAuthorize; |
| 8 | +import org.springframework.security.authentication.AuthenticationManager; |
| 9 | +import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; |
| 10 | +import org.springframework.security.config.annotation.rsocket.RSocketSecurity.AuthorizePayloadsSpec; |
| 11 | +import org.springframework.security.core.Authentication; |
| 12 | +import org.springframework.security.core.context.SecurityContextHolder; |
| 13 | +import org.springframework.security.crypto.password.PasswordEncoder; |
| 14 | +import org.springframework.web.bind.annotation.CrossOrigin; |
| 15 | +import org.springframework.web.bind.annotation.GetMapping; |
| 16 | +import org.springframework.web.bind.annotation.PostMapping; |
| 17 | +import org.springframework.web.bind.annotation.RequestBody; |
| 18 | +import org.springframework.web.bind.annotation.RequestMapping; |
| 19 | +import org.springframework.web.bind.annotation.RestController; |
| 20 | + |
| 21 | +import com.bookstore.api.entities.RefreshToken; |
| 22 | +import com.bookstore.api.entities.User; |
| 23 | +import com.bookstore.api.entities.dto.AuthResponse; |
| 24 | +import com.bookstore.api.entities.dto.RefreshRequest; |
| 25 | +import com.bookstore.api.entities.dto.UserRequest; |
| 26 | +import com.bookstore.api.entities.dto.UserRequestForRegister; |
| 27 | +import com.bookstore.api.jwt.JwtTokenProvider; |
| 28 | +import com.bookstore.api.services.RefreshTokenService; |
| 29 | +import com.bookstore.api.services.Abstract.UserService; |
| 30 | + |
| 31 | +@RestController |
| 32 | +@RequestMapping("/api/v1/auth") |
| 33 | +@CrossOrigin(origins = { "http://localhost:3000/", "http://localhost:3001" }) |
| 34 | +public class AuthController { |
| 35 | + |
| 36 | + private AuthenticationManager authenticationManager; |
| 37 | + private JwtTokenProvider jwtTokenProvider; |
| 38 | + private UserService userService; |
| 39 | + private PasswordEncoder passwordEncoder; |
| 40 | + private RefreshTokenService refreshTokenService; |
| 41 | + |
| 42 | + public AuthController(AuthenticationManager authenticationManager, JwtTokenProvider jwtTokenProvider, |
| 43 | + UserService userService, PasswordEncoder passwordEncoder, RefreshTokenService refreshTokenService) { |
| 44 | + this.authenticationManager = authenticationManager; |
| 45 | + this.jwtTokenProvider = jwtTokenProvider; |
| 46 | + this.userService = userService; |
| 47 | + this.passwordEncoder = passwordEncoder; |
| 48 | + this.refreshTokenService = refreshTokenService; |
| 49 | + |
| 50 | + } |
| 51 | + |
| 52 | + @PostMapping("/login") |
| 53 | + public AuthResponse login(@RequestBody UserRequest loginRequest) { |
| 54 | + UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken( |
| 55 | + loginRequest.getUserName(), |
| 56 | + loginRequest.getPassword()); |
| 57 | + |
| 58 | + Authentication auth = authenticationManager.authenticate(authToken); |
| 59 | + |
| 60 | + SecurityContextHolder.getContext().setAuthentication(auth); |
| 61 | + |
| 62 | + String jwtToken = jwtTokenProvider.generateJwtToken(auth); |
| 63 | + |
| 64 | + User user = userService.getOneUserByUserName(loginRequest.getUserName()); |
| 65 | + |
| 66 | + AuthResponse authResponse = new AuthResponse(); |
| 67 | + authResponse.setAccessToken("Bearer " + jwtToken); |
| 68 | + authResponse.setRefreshToken(refreshTokenService.createRefreshToken(user)); |
| 69 | + authResponse.setUserId(user.getId()); |
| 70 | + authResponse.setMessage("Successed."); |
| 71 | + authResponse.setFirstName(user.getFirstName()); |
| 72 | + authResponse.setLastName(user.getLastName()); |
| 73 | + |
| 74 | + return authResponse; |
| 75 | + } |
| 76 | + |
| 77 | + @PostMapping("/register") |
| 78 | + public ResponseEntity<AuthResponse> register(@RequestBody UserRequestForRegister registerRequest) { |
| 79 | + |
| 80 | + AuthResponse authResponse = new AuthResponse(); |
| 81 | + |
| 82 | + // User exists? |
| 83 | + if (userService.getOneUserByUserName(registerRequest.getUserName()) != null) { |
| 84 | + authResponse.setMessage("Username already in use."); |
| 85 | + return new ResponseEntity<>(authResponse, HttpStatus.BAD_REQUEST); |
| 86 | + } |
| 87 | + |
| 88 | + // User creating... |
| 89 | + User user = new User(); |
| 90 | + user.setFirstName(registerRequest.getFirstName()); |
| 91 | + user.setLastName(registerRequest.getLastName()); |
| 92 | + user.setUserName(registerRequest.getUserName()); |
| 93 | + user.setPassword(registerRequest.getPassword()); |
| 94 | + |
| 95 | + |
| 96 | + |
| 97 | + userService.saveOneUser(user); |
| 98 | + |
| 99 | + // Adding role -> User role is given by default |
| 100 | + // userRoleService.Add(user.getId(), 3); |
| 101 | + |
| 102 | + // |
| 103 | + UsernamePasswordAuthenticationToken authToken = new UsernamePasswordAuthenticationToken( |
| 104 | + registerRequest.getUserName(), |
| 105 | + registerRequest.getPassword()); |
| 106 | + |
| 107 | + Authentication auth = authenticationManager.authenticate(authToken); |
| 108 | + SecurityContextHolder.getContext().setAuthentication(auth); |
| 109 | + String jwtToken = jwtTokenProvider.generateJwtToken(auth); |
| 110 | + |
| 111 | + authResponse.setMessage("User successfully registered."); |
| 112 | + authResponse.setAccessToken("Bearer " + jwtToken); |
| 113 | + authResponse.setRefreshToken(refreshTokenService.createRefreshToken(user)); |
| 114 | + authResponse.setUserId(user.getId()); |
| 115 | + authResponse.setUserName(user.getUserName()); |
| 116 | + authResponse.setFirstName(user.getFirstName()); |
| 117 | + authResponse.setLastName(user.getLastName()); |
| 118 | + |
| 119 | + return new ResponseEntity<>(authResponse, HttpStatus.OK); |
| 120 | + } |
| 121 | + |
| 122 | + @PostMapping("/refresh") |
| 123 | + public ResponseEntity<AuthResponse> refresh(@RequestBody RefreshRequest refreshRequest) { |
| 124 | + AuthResponse authResponse = new AuthResponse(); |
| 125 | + |
| 126 | + RefreshToken token = refreshTokenService.getByUser(refreshRequest.getUserId()); |
| 127 | + |
| 128 | + if (token.getToken().equals(refreshRequest.getRefreshToken()) && |
| 129 | + !refreshTokenService.isRefreshExpired(token)) { |
| 130 | + |
| 131 | + User user = token.getUser(); |
| 132 | + |
| 133 | + String jwtToken = jwtTokenProvider.generateJwtTokenByUserId(user.getId()); |
| 134 | + |
| 135 | + authResponse.setMessage("Token has been refreshed successfully."); |
| 136 | + authResponse.setAccessToken("Bearer " + jwtToken); |
| 137 | + authResponse.setUserId(user.getId()); |
| 138 | + authResponse.setFirstName(user.getFirstName()); |
| 139 | + authResponse.setLastName(user.getLastName()); |
| 140 | + authResponse.setUserName(user.getUserName()); |
| 141 | + authResponse.setRefreshToken(token.getToken()); |
| 142 | + |
| 143 | + return new ResponseEntity<>(authResponse, HttpStatus.OK); |
| 144 | + } else { |
| 145 | + authResponse.setMessage("refresh token is not valid."); |
| 146 | + return new ResponseEntity<>(authResponse, HttpStatus.UNAUTHORIZED); |
| 147 | + } |
| 148 | + } |
| 149 | + |
| 150 | + @GetMapping("/users") |
| 151 | + public ResponseEntity<?> getUsers() { |
| 152 | + var response = userService.getAllUsers(); |
| 153 | + return ResponseEntity.ok(response); |
| 154 | + } |
| 155 | + |
| 156 | +} |
0 commit comments