Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 2c74f2a

Browse files
committed
JWT has been implemented.
1 parent 01f0915 commit 2c74f2a

File tree

6 files changed

+220
-0
lines changed

6 files changed

+220
-0
lines changed
Lines changed: 156 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,156 @@
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+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package com.bookstore.api.entities.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class AuthResponse {
7+
private String message;
8+
9+
private int userId;
10+
private String userName;
11+
12+
private String firstName;
13+
private String lastName;
14+
15+
private String accessToken;
16+
private String refreshToken;
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package com.bookstore.api.entities.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class RefreshRequest {
7+
private int userId;
8+
private String refreshToken;
9+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package com.bookstore.api.entities.dto;
2+
3+
import java.util.Set;
4+
5+
import com.bookstore.api.entities.Role;
6+
7+
import lombok.Data;
8+
9+
@Data
10+
public class UserDto {
11+
private int id;
12+
private String userName;
13+
private String firstName;
14+
private String lastName;
15+
private Set<Role> roles;
16+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.bookstore.api.entities.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class UserRequest {
7+
private String firstName;
8+
private String lastName;
9+
private String userName;
10+
private String password;
11+
}
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
package com.bookstore.api.entities.dto;
2+
3+
import lombok.Data;
4+
5+
@Data
6+
public class UserRequestForRegister {
7+
private String firstName;
8+
private String lastName;
9+
private String userName;
10+
private String password;
11+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /