From fddb65868cb05b085adf6dd9f9d3b253a780d57d Mon Sep 17 00:00:00 2001 From: ialbert Date: Thu, 29 Dec 2022 18:43:45 +0300 Subject: [PATCH] User: update, auth processing, get id --- .../controller/queue/user/UserController.java | 26 ++++++++++-- .../response/entity/user/UserIdResponse.java | 36 ++++++++++++++++ .../AuthAuditSuccessLoginHandler.java | 15 +++++-- .../backendapi/service/UserAuthProcessor.java | 7 +++- .../clearing/utility/service/UserService.java | 27 ++++++++++-- .../domain/cud/utilities/UserAuthRequest.java | 41 +++++++++++++++++++ 6 files changed, 141 insertions(+), 11 deletions(-) create mode 100644 clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/user/UserIdResponse.java diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserController.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserController.java index 1ab83b5c6..2fe5f3636 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserController.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/queue/user/UserController.java @@ -20,6 +20,7 @@ import ru.spcex.clearing.backendapi.controller.request.cud.utilities.UserAuthAct import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; import ru.spcex.clearing.backendapi.controller.response.cud.CudResponse; import ru.spcex.clearing.backendapi.controller.response.entity.CommonGetAllResponse; +import ru.spcex.clearing.backendapi.controller.response.entity.user.UserIdResponse; import ru.spcex.clearing.backendapi.security.KeycloakUtils; import ru.spcex.clearing.backendapi.service.IOperator; import ru.spcex.clearing.backendapi.service.IStateLoader; @@ -59,6 +60,23 @@ public class UserController extends AbstractQueueController { return response; } + @ApiOperation(value = "get my id.") + @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = UserIdResponse.class)}) + @RequestMapping(path = "get-my-id", method = RequestMethod.GET) + @ResponseBody + public UserIdResponse getId() { + UserIdResponse response = new UserIdResponse(); + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + String username = KeycloakUtils.getUserNameFromAuthentication(authentication); + User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); + if (user == null) { + log.info("getId user {} authenticated, but User object was not created", username); + throw new IllegalStateException("couldn't return user id"); + } + response.getPayload().setId(user.getId()); + return response; + } + @ApiOperation(value = "update user") @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = CudResponse.class), @ApiResponse(code = 400, message = "Ошибка валидации", response = BasicSpcexResponse.class)}) @@ -72,10 +90,10 @@ public class UserController extends AbstractQueueController { log.warn("user {} sended update request for user {}", username, userUpdateAction.getUsername()); throw new IllegalStateException("cannot perform delete action for " + username); } - User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); - if (user == null) { - log.info("user {} authenticated, but User object was not created", username); - } +// User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username)); +// if (user == null) { +// log.info("update user {} authenticated, but User object was not created", username); +// } return processRequest(Consts.USER_UPDATE, userUpdateAction); } diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/user/UserIdResponse.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/user/UserIdResponse.java new file mode 100644 index 000000000..a43e4f91d --- /dev/null +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/controller/response/entity/user/UserIdResponse.java @@ -0,0 +1,36 @@ +package ru.spcex.clearing.backendapi.controller.response.entity.user; + +import com.fasterxml.jackson.annotation.JsonProperty; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; +import ru.spcex.clearing.backendapi.controller.response.BasicSpcexResponse; + +@ApiModel(description = "Ответ содержащий id текущего пользователя.") +public class UserIdResponse extends BasicSpcexResponse { + + @JsonProperty + @ApiModelProperty(value = "Полезная нагрузка") + private UserIdPayload payload = new UserIdPayload(); + + public UserIdPayload getPayload() { + return payload; + } + + public void setPayload(UserIdPayload payload) { + this.payload = payload; + } + + public static class UserIdPayload { + @JsonProperty + @ApiModelProperty(value = "Id текущего пользователя") + private Long id; + + public Long getId() { + return id; + } + + public void setId(Long id) { + this.id = id; + } + } +} \ No newline at end of file diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/handlers/AuthAuditSuccessLoginHandler.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/handlers/AuthAuditSuccessLoginHandler.java index 6d39e9cbb..4ab762d94 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/handlers/AuthAuditSuccessLoginHandler.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/security/handlers/AuthAuditSuccessLoginHandler.java @@ -3,6 +3,7 @@ package ru.spcex.clearing.backendapi.security.handlers; import org.keycloak.KeycloakPrincipal; import org.keycloak.adapters.spi.KeycloakAccount; import org.keycloak.adapters.springsecurity.token.KeycloakAuthenticationToken; +import org.keycloak.representations.AccessToken; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -34,16 +35,24 @@ public class AuthAuditSuccessLoginHandler implements AuthenticationSuccessHandle try { KeycloakAuthenticationToken auth = (KeycloakAuthenticationToken) authentication; KeycloakAccount details = (KeycloakAccount) auth.getDetails(); - String username = ((KeycloakPrincipal) details.getPrincipal()) - .getKeycloakSecurityContext() + KeycloakPrincipal principal = (KeycloakPrincipal) details.getPrincipal(); + String username = principal.getKeycloakSecurityContext() .getToken() .getPreferredUsername(); Set roles = details.getRoles(); if (roles.contains(Admin.getKey()) || roles.contains(Security.getKey()) || roles.contains(Superviser.getKey())) { + AccessToken token = principal.getKeycloakSecurityContext().getToken(); String clientIp = request != null ? request.getRemoteAddr() : null; String serverIp = request != null ? request.getLocalAddr() : null; - userAutoCreation.sendAuthSuccessEvent(username, roles, clientIp, serverIp); + userAutoCreation.sendAuthSuccessEvent(username, + roles, + clientIp, + serverIp, + token.getEmail(), + token.getGivenName(), + token.getFamilyName(), + token.getMiddleName()); } } catch (Throwable e) { log.error(ExceptionUtils.getStackTrace(e)); diff --git a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/UserAuthProcessor.java b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/UserAuthProcessor.java index e160f761a..a98799a8a 100644 --- a/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/UserAuthProcessor.java +++ b/clearing-parent/backend-api/src/main/java/ru/spcex/clearing/backendapi/service/UserAuthProcessor.java @@ -33,7 +33,8 @@ public class UserAuthProcessor { this.operator = operator; } - public void sendAuthSuccessEvent(String identifier, Collection roles, String userIp, String serverIp) { + public void sendAuthSuccessEvent(String identifier, Collection roles, String userIp, String serverIp, + String email, String name, String surname, String middleName) { UserAuthSystemAction authEvent = new UserAuthSystemAction(); UserAuthRequest requestData = authEvent.toRequest(); requestData.setUsername(identifier); @@ -41,6 +42,10 @@ public class UserAuthProcessor { requestData.setRoles(new ArrayList<>(roles)); requestData.setServerIp(serverIp + ":" + serverPort); //getServerAddress() + ":" + serverPort requestData.setClientIp(userIp); + requestData.setEmail(email); + requestData.setName(name); + requestData.setSurname(surname); + requestData.setMiddleName(middleName); try { operator.sendRequestToQueue(Consts.USER_AUTH_SUCCESS, authEvent); } catch (Throwable e) { //ExecutionException | InterruptedException diff --git a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java index 5f7c95189..000a4f36e 100644 --- a/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java +++ b/clearing-parent/utility-service/src/main/java/ru/spcex/clearing/utility/service/UserService.java @@ -28,6 +28,7 @@ import java.time.LocalDate; import java.util.Collection; import java.util.Collections; import java.util.Map; +import java.util.Objects; import java.util.function.Function; import java.util.stream.Collectors; import java.util.stream.Stream; @@ -121,10 +122,28 @@ public class UserService extends QueueConsumer implements InitializingBean { UserAuthRequest authInfo = authEvent.getRequestPayload(); log.debug("user name={} authenticated", authInfo.getUsername()); UserInfo userInfo = createUserIfNeeded(authInfo.getUsername()); + updatePersonalInfoIfNeeded(userInfo, authInfo.getEmail(), authInfo.getName(), authInfo.getSurname(), authInfo.getMiddleName()); changeRoles(userInfo.userId, userInfo.isNew, authInfo.getRoles()); connected(userInfo.userId, authInfo.getTime(), authInfo.getClientIp(), authInfo.getServerIp()); } + private void updatePersonalInfoIfNeeded(UserInfo userInfo, String email, String name, String surname, String middleName) { + User user = userInfo.user; + if (!Objects.equals(user.getEmail(), email) + || !Objects.equals(user.getName(), name) + || !Objects.equals(user.getLastName(), surname) + || !Objects.equals(user.getMiddleName(), middleName)) { + user.setEmail(email); + user.setName(name); + user.setLastName(surname); + user.setMiddleName(middleName); + if (!userInfo.isNew) { + user.setUpdated(Instant.now()); + } + userMap.update(user); + } + } + private void usersLogoutSuccess(BaseRequest logoutEvent) { UserLogoutRequest logoutInfo = logoutEvent.getRequestPayload(); log.debug("user name={} logout", logoutInfo.getUsername()); @@ -152,9 +171,9 @@ public class UserService extends QueueConsumer implements InitializingBean { user.setCreated(Instant.now()); user.setIdentifier(username); userMap.insert(user); - return new UserInfo(true, user.getId()); + return new UserInfo(true, user.getId(), user); } else { - return new UserInfo(false, user.getId()); + return new UserInfo(false, user.getId(), user); } } @@ -223,10 +242,12 @@ public class UserService extends QueueConsumer implements InitializingBean { private static class UserInfo { boolean isNew; Long userId; + User user; - public UserInfo(boolean isNew, Long userId) { + public UserInfo(boolean isNew, Long userId, User user) { this.isNew = isNew; this.userId = userId; + this.user = user; } } } diff --git a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserAuthRequest.java b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserAuthRequest.java index 9cbd07989..1b0754f13 100644 --- a/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserAuthRequest.java +++ b/platform-parent/platform-messaging/src/main/java/ru/spcex/clearing/platform/messaging/domain/cud/utilities/UserAuthRequest.java @@ -23,6 +23,15 @@ public class UserAuthRequest { private String serverIp; @JsonProperty private String clientIp; + @JsonProperty + private String email; + @JsonProperty + private String name; + @JsonProperty + private String surname; + @JsonProperty + private String middleName; + public String getUsername() { return username; @@ -63,4 +72,36 @@ public class UserAuthRequest { public void setClientIp(String clientIp) { this.clientIp = clientIp; } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getSurname() { + return surname; + } + + public void setSurname(String surname) { + this.surname = surname; + } + + public String getMiddleName() { + return middleName; + } + + public void setMiddleName(String middleName) { + this.middleName = middleName; + } }