separated user update from user auth success

This commit is contained in:
ialbert 2022-12-29 16:33:02 +03:00
parent 8093bfe833
commit 71d01af671
7 changed files with 117 additions and 54 deletions

View file

@ -3,6 +3,8 @@ package ru.spcex.clearing.backendapi.controller.queue.user;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiResponse;
import io.swagger.annotations.ApiResponses;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.security.core.Authentication;
@ -33,6 +35,7 @@ import java.util.concurrent.ExecutionException;
@Controller
@RequestMapping("/users")
public class UserController extends AbstractQueueController {
private Logger log = LoggerFactory.getLogger(getClass());
private final IStateLoader stateLoader;
private final Imdg<User> userImdg;
@ -62,14 +65,18 @@ public class UserController extends AbstractQueueController {
@RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public CudResponse update(
@RequestBody UserAuthAction userAuthAction) throws ExecutionException, InterruptedException {
@RequestBody UserAuthAction userUpdateAction) throws ExecutionException, InterruptedException {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
String username = KeycloakUtils.getUserNameFromAuthentication(authentication);
if (!username.equals(userUpdateAction.getUsername())) {
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) {
return processRequest(Consts.USER_AUTH_SUCCESS, userAuthAction);
log.info("user {} authenticated, but User object was not created", username);
}
throw new IllegalStateException("cannot create user cause it is exists: " + username);
return processRequest(Consts.USER_UPDATE, userUpdateAction);
}

View file

@ -2,35 +2,24 @@ package ru.spcex.clearing.backendapi.controller.request.cud.utilities;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserAuthRequest;
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.InstantDeserializer;
import ru.spcex.clearing.platform.messaging.domain.json.serialize.InstantSerializer;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserUpdateRequest;
import ru.spcex.platform.enumeration.UserRole;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import ru.spcex.platform.utils.enumeration.IEnumKey;
import java.time.Instant;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class UserAuthAction implements IAction<UserAuthRequest> {
public class UserAuthAction implements IAction<UserUpdateRequest> {
@JsonProperty
private String username;
@JsonProperty
private List<String> roles = new ArrayList<>();
@JsonSerialize(using = InstantSerializer.class)
@JsonDeserialize(using = InstantDeserializer.class)
@JsonProperty
private Instant time;
@JsonProperty
private String serverIp;
@JsonProperty
private String clientIp;
@Override
public Collection<EnumMessage> validate() {
@ -38,24 +27,27 @@ public class UserAuthAction implements IAction<UserAuthRequest> {
if (count != roles.size()) {
return List.of(new EnumMessage(BackEndError.KeycloakRepeatedRoles));
}
boolean unknownRolePresent = roles
.stream()
.anyMatch(role -> IEnumKey.getEnumByKey(UserRole.class, role) == null);
if (unknownRolePresent) {
return List.of(new EnumMessage(BackEndError.ValidationError, roles));
}
return Collections.emptyList();
}
@Override
public UserAuthRequest toRequest() {
UserAuthRequest userAuthRequest = new UserAuthRequest();
userAuthRequest.setServerIp(serverIp);
userAuthRequest.setClientIp(clientIp);
userAuthRequest.setUsername(username);
userAuthRequest.setRoles(roles);
userAuthRequest.setTime(time);
return userAuthRequest;
public UserUpdateRequest toRequest() {
UserUpdateRequest userUpdateRequest = new UserUpdateRequest();
userUpdateRequest.setUsername(username);
userUpdateRequest.setRoles(roles);
return userUpdateRequest;
}
@Override
public ActionType getActionType() {
return ActionType.SYSTEM;
return ActionType.UPDATE;
}
public String getUsername() {
@ -73,28 +65,4 @@ public class UserAuthAction implements IAction<UserAuthRequest> {
public void setRoles(List<String> roles) {
this.roles = roles;
}
public Instant getTime() {
return time;
}
public void setTime(Instant time) {
this.time = time;
}
public String getServerIp() {
return serverIp;
}
public void setServerIp(String serverIp) {
this.serverIp = serverIp;
}
public String getClientIp() {
return clientIp;
}
public void setClientIp(String clientIp) {
this.clientIp = clientIp;
}
}

View file

@ -0,0 +1,42 @@
package ru.spcex.clearing.backendapi.controller.request.cud.utilities;
import ru.spcex.clearing.backendapi.domain.actions.IAction;
import ru.spcex.clearing.backendapi.errors.BackEndError;
import ru.spcex.clearing.platform.messaging.domain.ActionType;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserAuthRequest;
import ru.spcex.platform.utils.enumeration.EnumMessage;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
public class UserAuthSystemAction implements IAction<UserAuthRequest> {
private final UserAuthRequest authRequest;
public UserAuthSystemAction() {
this.authRequest = new UserAuthRequest();
}
public UserAuthRequest getAuthRequest() {
return authRequest;
}
@Override
public Collection<EnumMessage> validate() {
long count = authRequest.getRoles().stream().distinct().count();
if (count != authRequest.getRoles().size()) {
return List.of(new EnumMessage(BackEndError.KeycloakRepeatedRoles));
}
return Collections.emptyList();
}
@Override
public UserAuthRequest toRequest() {
return authRequest;
}
@Override
public ActionType getActionType() {
return ActionType.SYSTEM;
}}

View file

@ -5,9 +5,10 @@ import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import ru.spcex.clearing.backendapi.controller.request.cud.utilities.UserAuthAction;
import ru.spcex.clearing.backendapi.controller.request.cud.utilities.UserAuthSystemAction;
import ru.spcex.clearing.backendapi.controller.request.cud.utilities.UserLogoutAction;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserAuthRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserLogoutRequest;
import ru.spcex.platform.utils.log.ExceptionUtils;
@ -33,14 +34,15 @@ public class UserAuthProcessor {
}
public void sendAuthSuccessEvent(String identifier, Collection<String> roles, String userIp, String serverIp) {
UserAuthAction requestData = new UserAuthAction();
UserAuthSystemAction authEvent = new UserAuthSystemAction();
UserAuthRequest requestData = authEvent.toRequest();
requestData.setUsername(identifier);
requestData.setTime(Instant.now());
requestData.setRoles(new ArrayList<>(roles));
requestData.setServerIp(serverIp + ":" + serverPort); //getServerAddress() + ":" + serverPort
requestData.setClientIp(userIp);
try {
operator.sendRequestToQueue(Consts.USER_AUTH_SUCCESS, requestData);
operator.sendRequestToQueue(Consts.USER_AUTH_SUCCESS, authEvent);
} catch (Throwable e) { //ExecutionException | InterruptedException
log.error(ExceptionUtils.getStackTrace(e));
}

View file

@ -14,6 +14,7 @@ import ru.spcex.clearing.platform.messaging.domain.BaseRequest;
import ru.spcex.clearing.platform.messaging.domain.Consts;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserAuthRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserLogoutRequest;
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserUpdateRequest;
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
import ru.spcex.platform.enumeration.ConnectionState;
import ru.spcex.platform.enumeration.Status;
@ -97,12 +98,25 @@ public class UserService extends QueueConsumer implements InitializingBean {
callback(UserAuthRequest.class)
.setConsumer(this::userAuthSuccess)
.forDestination(Consts.USER_AUTH_SUCCESS, callbacks::put);
callback(UserUpdateRequest.class)
.setConsumer(this::userUpdate)
.forDestination(Consts.USER_UPDATE, callbacks::put);
callback(UserLogoutRequest.class)
.setConsumer(this::usersLogoutSuccess)
.forDestination(Consts.USER_LOGOUT_SUCCESS, callbacks::put);
init();
}
private void userUpdate(BaseRequest<UserUpdateRequest> updateEvent) {
UserUpdateRequest updateInfo = updateEvent.getRequestPayload();
log.debug("user name={} update request", updateInfo.getUsername());
UserInfo userInfo = createUserIfNeeded(updateInfo.getUsername());
if (userInfo.isNew) {
log.warn("update for non-existent user");
}
changeRoles(userInfo.userId, userInfo.isNew, updateInfo.getRoles());
}
private void userAuthSuccess(BaseRequest<UserAuthRequest> authEvent) {
UserAuthRequest authInfo = authEvent.getRequestPayload();
log.debug("user name={} authenticated", authInfo.getUsername());

View file

@ -39,6 +39,7 @@ public interface Consts {
String DESTINATION_SDF02_NEW = "s-df-02-new";
String USER_AUTH_SUCCESS = "user-auth-success";
String USER_UPDATE = "user-update";
String USER_LOGOUT_SUCCESS = "user-logout-success";
String USER_SETTINGS_UPDATE = "user-settings-update";

View file

@ -0,0 +1,29 @@
package ru.spcex.clearing.platform.messaging.domain.cud.utilities;
import com.fasterxml.jackson.annotation.JsonProperty;
import java.util.ArrayList;
import java.util.List;
public class UserUpdateRequest {
@JsonProperty
private String username;
@JsonProperty
private List<String> roles = new ArrayList<>();
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public List<String> getRoles() {
return roles;
}
public void setRoles(List<String> roles) {
this.roles = roles;
}
}