Skip to content

Commit b6713d8

Browse files
author
rcsoyer
committed
set up this own application user type, to the spring security context
1 parent 8683cb7 commit b6713d8

2 files changed

Lines changed: 42 additions & 20 deletions

File tree

src/main/java/org/acme/authorization_server/application/web/LoginSuccessHandler.java

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,12 @@
44
import jakarta.servlet.http.HttpServletRequest;
55
import jakarta.servlet.http.HttpServletResponse;
66
import java.io.IOException;
7+
import lombok.RequiredArgsConstructor;
78
import lombok.extern.slf4j.Slf4j;
9+
import org.acme.authorization_server.domain.service.SecurityService;
810
import org.acme.authorization_server.domain.service.UserService;
9-
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
1011
import org.springframework.security.core.Authentication;
1112
import org.springframework.security.core.context.SecurityContextHolder;
12-
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
1313
import org.springframework.security.oauth2.core.user.OAuth2User;
1414
import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler;
1515
import org.springframework.stereotype.Component;
@@ -18,24 +18,22 @@
1818

1919
@Slf4j
2020
@Component
21+
@RequiredArgsConstructor
2122
public class LoginSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler {
2223

2324
private final UserService userService;
24-
25-
public LoginSuccessHandler(final UserService userService) {
26-
super();
27-
this.userService = userService;
28-
}
25+
private final SecurityService securityService;
2926

3027
@Override
3128
public void onAuthenticationSuccess(final HttpServletRequest request,
3229
final HttpServletResponse response,
3330
final Authentication authentication)
3431
throws ServletException, IOException {
32+
final String userName = ((OAuth2User) authentication.getPrincipal()).getAttribute("email");
3533

36-
if (userService.existsByEmail(authentication.getName())) {
37-
final var applicationAuthentication = setApplicationAuthentication(authentication);
38-
super.onAuthenticationSuccess(request, response, applicationAuthentication);
34+
if (userService.existsByEmail(userName)) {
35+
securityService.setAuthenticationContext(userName);
36+
super.onAuthenticationSuccess(request, response, authentication);
3937
} else {
4038
userNotFoundInApplication(request, response);
4139
}
@@ -52,14 +50,4 @@ private void userNotFoundInApplication(final HttpServletRequest request,
5250
+ "Before making login with identity providers, its necessary "
5351
+ "to create an User in this application, with the same email as username");
5452
}
55-
56-
private Authentication setApplicationAuthentication(final Authentication authentication) {
57-
final var principal = (OAuth2AuthenticationToken) authentication.getPrincipal();
58-
final OAuth2User oAuth2User = principal.getPrincipal();
59-
final String username = oAuth2User.getAttribute("email");
60-
final var applicationAuthentication =
61-
new UsernamePasswordAuthenticationToken(username, null);
62-
SecurityContextHolder.getContext().setAuthentication(applicationAuthentication);
63-
return applicationAuthentication;
64-
}
6553
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package org.acme.authorization_server.domain.service;
2+
3+
import lombok.RequiredArgsConstructor;
4+
import lombok.extern.slf4j.Slf4j;
5+
import org.acme.authorization_server.domain.dto.command.AppAuthenticationSuccessEvent;
6+
import org.springframework.context.ApplicationEventPublisher;
7+
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
8+
import org.springframework.security.core.context.SecurityContextHolder;
9+
import org.springframework.security.core.userdetails.UserDetails;
10+
import org.springframework.security.core.userdetails.UserDetailsService;
11+
import org.springframework.stereotype.Service;
12+
13+
@Slf4j
14+
@Service
15+
@RequiredArgsConstructor
16+
public class SecurityService {
17+
18+
private final UserDetailsService userDetailsService;
19+
private final ApplicationEventPublisher eventPublisher;
20+
21+
public void setAuthenticationContext(final String username) {
22+
log
23+
.atDebug()
24+
.addKeyValue("username", username)
25+
.log("Validate the User exists in this platform and set it up in the security context");
26+
final UserDetails appUser = userDetailsService.loadUserByUsername(username);
27+
final var authenticationToken =
28+
new UsernamePasswordAuthenticationToken(appUser.getUsername(),
29+
appUser.getPassword(),
30+
appUser.getAuthorities());
31+
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
32+
eventPublisher.publishEvent(new AppAuthenticationSuccessEvent(authenticationToken));
33+
}
34+
}

0 commit comments

Comments
 (0)