-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathOAuth2LoginSuccessHandler.java
More file actions
88 lines (70 loc) · 3.08 KB
/
Copy pathOAuth2LoginSuccessHandler.java
File metadata and controls
88 lines (70 loc) · 3.08 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package demo.codeexample.security;
import demo.codeexample.user.UserAuthPort;
import demo.codeexample.user.UserDto;
import demo.codeexample.user.UserLookup;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.security.core.Authentication;
import org.springframework.security.oauth2.core.user.OAuth2User;
import org.springframework.security.web.authentication.AuthenticationSuccessHandler;
import org.springframework.stereotype.Component;
import java.io.IOException;
@Component
public class OAuth2LoginSuccessHandler implements AuthenticationSuccessHandler {
private final UserLookup userLookup; // for findByEmail (read)
private final UserAuthPort userAuthPort; // for createOAuthUser (auth)
private final JwtService jwtService;
@Value("${cookie.secure:true}")
private boolean cookieSecure;
public OAuth2LoginSuccessHandler(UserLookup userLookup,
UserAuthPort userAuthPort,
JwtService jwtService) {
this.userLookup = userLookup;
this.userAuthPort = userAuthPort;
this.jwtService = jwtService;
}
@Override
public void onAuthenticationSuccess(HttpServletRequest request,
HttpServletResponse response,
Authentication authentication)
throws IOException {
OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal();
String email = oAuth2User.getAttribute("email");
String firstName = oAuth2User.getAttribute("given_name");
String lastName = oAuth2User.getAttribute("family_name");
if (email == null || email.isBlank()) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED,
"OAuth2 provider did not supply an email");
return;
}
// Read via UserLookup, create via UserAuthPort
UserDto user = userLookup.findByEmail(email)
.orElseGet(() -> userAuthPort.createOAuthUser(
email, firstName, lastName
));
if (!user.isActive()) {
response.sendError(HttpServletResponse.SC_FORBIDDEN,
"Account is deactivated");
return;
}
String token = jwtService.generateToken(
user.getId(),
user.getEmail(),
user.getRole()
);
String cookieValue = "jwt=" + token
+ "; HttpOnly"
+ "; Path=/"
+ "; Max-Age=86400"
+ "; SameSite=Strict"
+ (cookieSecure ? "; Secure" : "");
response.setHeader("Set-Cookie", cookieValue);
String redirectUrl = switch (user.getRole()) {
case ADMIN, DIRECTOR, PRODUCER,
RECRUITER, EDITOR -> "/dashboard/current";
default -> "/home";
};
response.sendRedirect(redirectUrl);
}
}