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.ApiOperation;
|
||||||
import io.swagger.annotations.ApiResponse;
|
import io.swagger.annotations.ApiResponse;
|
||||||
import io.swagger.annotations.ApiResponses;
|
import io.swagger.annotations.ApiResponses;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.security.core.Authentication;
|
import org.springframework.security.core.Authentication;
|
||||||
|
|
@ -33,6 +35,7 @@ import java.util.concurrent.ExecutionException;
|
||||||
@Controller
|
@Controller
|
||||||
@RequestMapping("/users")
|
@RequestMapping("/users")
|
||||||
public class UserController extends AbstractQueueController {
|
public class UserController extends AbstractQueueController {
|
||||||
|
private Logger log = LoggerFactory.getLogger(getClass());
|
||||||
private final IStateLoader stateLoader;
|
private final IStateLoader stateLoader;
|
||||||
private final Imdg<User> userImdg;
|
private final Imdg<User> userImdg;
|
||||||
|
|
||||||
|
|
@ -62,14 +65,18 @@ public class UserController extends AbstractQueueController {
|
||||||
@RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
|
@RequestMapping(method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE)
|
||||||
@ResponseBody
|
@ResponseBody
|
||||||
public CudResponse update(
|
public CudResponse update(
|
||||||
@RequestBody UserAuthAction userAuthAction) throws ExecutionException, InterruptedException {
|
@RequestBody UserAuthAction userUpdateAction) throws ExecutionException, InterruptedException {
|
||||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||||
String username = KeycloakUtils.getUserNameFromAuthentication(authentication);
|
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));
|
User user = userImdg.getSingleObjectByFieldValues(Map.of("identifier", username));
|
||||||
if (user == null) {
|
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.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.domain.actions.IAction;
|
||||||
import ru.spcex.clearing.backendapi.errors.BackEndError;
|
import ru.spcex.clearing.backendapi.errors.BackEndError;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.ActionType;
|
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.cud.utilities.UserUpdateRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.deserialize.InstantDeserializer;
|
import ru.spcex.platform.enumeration.UserRole;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.json.serialize.InstantSerializer;
|
|
||||||
import ru.spcex.platform.utils.enumeration.EnumMessage;
|
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.ArrayList;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public class UserAuthAction implements IAction<UserAuthRequest> {
|
public class UserAuthAction implements IAction<UserUpdateRequest> {
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
private String username;
|
private String username;
|
||||||
@JsonProperty
|
@JsonProperty
|
||||||
private List<String> roles = new ArrayList<>();
|
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
|
@Override
|
||||||
public Collection<EnumMessage> validate() {
|
public Collection<EnumMessage> validate() {
|
||||||
|
|
@ -38,24 +27,27 @@ public class UserAuthAction implements IAction<UserAuthRequest> {
|
||||||
if (count != roles.size()) {
|
if (count != roles.size()) {
|
||||||
return List.of(new EnumMessage(BackEndError.KeycloakRepeatedRoles));
|
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();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public UserAuthRequest toRequest() {
|
public UserUpdateRequest toRequest() {
|
||||||
UserAuthRequest userAuthRequest = new UserAuthRequest();
|
UserUpdateRequest userUpdateRequest = new UserUpdateRequest();
|
||||||
userAuthRequest.setServerIp(serverIp);
|
userUpdateRequest.setUsername(username);
|
||||||
userAuthRequest.setClientIp(clientIp);
|
userUpdateRequest.setRoles(roles);
|
||||||
userAuthRequest.setUsername(username);
|
return userUpdateRequest;
|
||||||
userAuthRequest.setRoles(roles);
|
|
||||||
userAuthRequest.setTime(time);
|
|
||||||
return userAuthRequest;
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public ActionType getActionType() {
|
public ActionType getActionType() {
|
||||||
return ActionType.SYSTEM;
|
return ActionType.UPDATE;
|
||||||
}
|
}
|
||||||
|
|
||||||
public String getUsername() {
|
public String getUsername() {
|
||||||
|
|
@ -73,28 +65,4 @@ public class UserAuthAction implements IAction<UserAuthRequest> {
|
||||||
public void setRoles(List<String> roles) {
|
public void setRoles(List<String> roles) {
|
||||||
this.roles = 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.Autowired;
|
||||||
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.beans.factory.annotation.Value;
|
||||||
import org.springframework.stereotype.Service;
|
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.backendapi.controller.request.cud.utilities.UserLogoutAction;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.Consts;
|
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.UserLogoutRequest;
|
||||||
import ru.spcex.platform.utils.log.ExceptionUtils;
|
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) {
|
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.setUsername(identifier);
|
||||||
requestData.setTime(Instant.now());
|
requestData.setTime(Instant.now());
|
||||||
requestData.setRoles(new ArrayList<>(roles));
|
requestData.setRoles(new ArrayList<>(roles));
|
||||||
requestData.setServerIp(serverIp + ":" + serverPort); //getServerAddress() + ":" + serverPort
|
requestData.setServerIp(serverIp + ":" + serverPort); //getServerAddress() + ":" + serverPort
|
||||||
requestData.setClientIp(userIp);
|
requestData.setClientIp(userIp);
|
||||||
try {
|
try {
|
||||||
operator.sendRequestToQueue(Consts.USER_AUTH_SUCCESS, requestData);
|
operator.sendRequestToQueue(Consts.USER_AUTH_SUCCESS, authEvent);
|
||||||
} catch (Throwable e) { //ExecutionException | InterruptedException
|
} catch (Throwable e) { //ExecutionException | InterruptedException
|
||||||
log.error(ExceptionUtils.getStackTrace(e));
|
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.Consts;
|
||||||
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserAuthRequest;
|
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.UserLogoutRequest;
|
||||||
|
import ru.spcex.clearing.platform.messaging.domain.cud.utilities.UserUpdateRequest;
|
||||||
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
import ru.spcex.clearing.platform.messaging.service.QueueConsumer;
|
||||||
import ru.spcex.platform.enumeration.ConnectionState;
|
import ru.spcex.platform.enumeration.ConnectionState;
|
||||||
import ru.spcex.platform.enumeration.Status;
|
import ru.spcex.platform.enumeration.Status;
|
||||||
|
|
@ -97,12 +98,25 @@ public class UserService extends QueueConsumer implements InitializingBean {
|
||||||
callback(UserAuthRequest.class)
|
callback(UserAuthRequest.class)
|
||||||
.setConsumer(this::userAuthSuccess)
|
.setConsumer(this::userAuthSuccess)
|
||||||
.forDestination(Consts.USER_AUTH_SUCCESS, callbacks::put);
|
.forDestination(Consts.USER_AUTH_SUCCESS, callbacks::put);
|
||||||
|
callback(UserUpdateRequest.class)
|
||||||
|
.setConsumer(this::userUpdate)
|
||||||
|
.forDestination(Consts.USER_UPDATE, callbacks::put);
|
||||||
callback(UserLogoutRequest.class)
|
callback(UserLogoutRequest.class)
|
||||||
.setConsumer(this::usersLogoutSuccess)
|
.setConsumer(this::usersLogoutSuccess)
|
||||||
.forDestination(Consts.USER_LOGOUT_SUCCESS, callbacks::put);
|
.forDestination(Consts.USER_LOGOUT_SUCCESS, callbacks::put);
|
||||||
init();
|
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) {
|
private void userAuthSuccess(BaseRequest<UserAuthRequest> authEvent) {
|
||||||
UserAuthRequest authInfo = authEvent.getRequestPayload();
|
UserAuthRequest authInfo = authEvent.getRequestPayload();
|
||||||
log.debug("user name={} authenticated", authInfo.getUsername());
|
log.debug("user name={} authenticated", authInfo.getUsername());
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,7 @@ public interface Consts {
|
||||||
String DESTINATION_SDF02_NEW = "s-df-02-new";
|
String DESTINATION_SDF02_NEW = "s-df-02-new";
|
||||||
|
|
||||||
String USER_AUTH_SUCCESS = "user-auth-success";
|
String USER_AUTH_SUCCESS = "user-auth-success";
|
||||||
|
String USER_UPDATE = "user-update";
|
||||||
String USER_LOGOUT_SUCCESS = "user-logout-success";
|
String USER_LOGOUT_SUCCESS = "user-logout-success";
|
||||||
String USER_SETTINGS_UPDATE = "user-settings-update";
|
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