separated user update from user auth success
This commit is contained in:
parent
8093bfe833
commit
71d01af671
7 changed files with 117 additions and 54 deletions
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}}
|
||||
|
|
@ -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));
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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());
|
||||
|
|
|
|||
|
|
@ -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";
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Reference in a new issue