Jelajahi Sumber

feat:用户租户迁移

fantingwei 1 tahun lalu
induk
melakukan
55b09dd9c8

+ 12 - 0
smsb-customer-manager-adapter/src/main/java/com/inspur/customer/web/controller/keyclaok/KeycloakUserController.java

@@ -14,6 +14,7 @@ import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.keycloak.UsersRoleMappingDTO;
 import com.inspur.customer.object.org.*;
+import com.inspur.customer.object.tenant.SmsbUserTenantTransferDto;
 import com.inspur.customer.object.wechat.SubscribeDto;
 import com.inspur.logging.annotation.SmsbMethodLog;
 import com.inspur.logging.annotation.SmsbSysLog;
@@ -237,6 +238,17 @@ public class KeycloakUserController {
         return departmentService.regrouping(smsbRegrouping);
     }
 
+    @SmsbMethodLog(description = "用户租户迁移", business = "完成用户的租户迁移")
+    @PostMapping("/admin/users/tenantTransfer")
+    public Response tenantTransfer(@RequestHeader String userId, @Valid @RequestBody SmsbUserTenantTransferDto transferDto) {
+        // 检查该用户是否有超级管理员权限 或 该用户是这个租户且有租户管理员权限
+        Response checkResponse = departmentService.checkOperationAuthority(userId, transferDto.getTenant());
+        if (!checkResponse.isSuccess()) {
+            return checkResponse;
+        }
+        return userService.tenantTransfer(transferDto);
+    }
+
     @SmsbMethodLog(description = "账号注销", business = "注销账号【${userName}】")
     @DeleteMapping("/admin/users/{uId}")
     public Response enableSwitch(@RequestHeader String userId, @PathVariable("uId") String uId, String userName) {

+ 13 - 1
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/keycloak/KeycloakServiceImpl.java

@@ -382,7 +382,19 @@ public class KeycloakServiceImpl implements KeycloakService {
         return SingleResponse.buildSuccess();
     }
 
-    private List<String>  getGroupId(List<String> targetGroups ,  List<GroupRepresentation> groups){
+    @Override
+    public Response userTenantTransfer(Set<String> smsbUserIdSet, String tenant) {
+        smsbUserIdSet.forEach(smsbUserId -> {
+            // 根据smsbUserId获取用户信息
+            UserResource userResource = realmResource.users().get(smsbUserId);
+            // 移出当前groups
+            userResource.groups().forEach(currentGroup -> userResource.leaveGroup(currentGroup.getId()));
+            // 加入指定group
+            userResource.joinGroup(realmResource.getGroupByPath(tenant).getId());
+        });
+        return Response.buildSuccess();
+    }
+    private List<String> getGroupId(List<String> targetGroups, List<GroupRepresentation> groups) {
         List<String> groupIds = Lists.newArrayList();
         GroupRepresentation group = groups.stream().filter(ele -> targetGroups.contains(ele.getName())).findFirst().get();
         groupIds.add(group.getId());

+ 24 - 0
smsb-customer-manager-app/src/main/java/com/inspur/customer/service/org/SmsbDepartmentUserServiceImpl.java

@@ -11,6 +11,7 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
+import com.inspur.customer.client.keycloak.KeycloakService;
 import com.inspur.customer.client.org.SmsbDepartmentService;
 import com.inspur.customer.client.org.SmsbDepartmentUserService;
 import com.inspur.customer.constant.Constant;
@@ -20,6 +21,7 @@ import com.inspur.customer.infrastructure.object.org.SmsbDepartmentUserDO;
 import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.org.*;
+import com.inspur.customer.object.tenant.SmsbUserTenantTransferDto;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.dubbo.config.annotation.DubboReference;
@@ -46,6 +48,10 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
     @Lazy
     @Resource
     private SmsbDepartmentService departmentService;
+
+    @Resource
+    private KeycloakService keycloakService;
+
     @Override
     public Boolean addUserDepartment(String userId, SmsbUserAdd smsbUserAdd) {
         return super.save(SmsbDepartmentConvertor.toDataObjectForCreate(userId , smsbUserAdd));
@@ -281,4 +287,22 @@ public class SmsbDepartmentUserServiceImpl extends ServiceImpl<SmsbDepartmentUse
         }
         return Lists.newArrayList();
     }
+
+    @Override
+    public Response tenantTransfer(SmsbUserTenantTransferDto transferDto) {
+        log.info("SmsbUserTenantTransferDto:{}", transferDto);
+
+        // 根据smsbUserId批量修改用户的path和tenant
+        List<SmsbDepartmentUserDO> userList = new ArrayList<>(transferDto.getSmsbUserIdPathMap().size());
+        for (Map.Entry<String, String> entry : transferDto.getSmsbUserIdPathMap().entrySet()) {
+            SmsbDepartmentUserDO userDO = this.baseMapper.selectOne(new LambdaQueryWrapper<SmsbDepartmentUserDO>().eq(SmsbDepartmentUserDO::getUserId, entry.getKey()));
+            userDO.setPath(entry.getValue());
+            userDO.setTenant(transferDto.getTenant());
+            userList.add(userDO);
+        }
+        this.updateBatchById(userList);
+
+        // keycloak操作,修改用户的租户
+        return keycloakService.userTenantTransfer(transferDto.getSmsbUserIdPathMap().keySet(), transferDto.getTenant());
+    }
 }

+ 10 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/keycloak/KeycloakService.java

@@ -14,6 +14,7 @@ import org.keycloak.representations.idm.UserRepresentation;
 
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 /**
  * keycloak接口能力适配
@@ -148,6 +149,15 @@ public interface KeycloakService {
      */
     Response regrouping(String userId , String groupId);
 
+    /**
+     * 用户租户迁移
+     *
+     * @param smsbUserIdSet 需要迁移的用户userId
+     * @param tenant        迁移的租户
+     * @return
+     */
+    Response userTenantTransfer(Set<String> smsbUserIdSet, String tenant);
+
     /**
      * 用户角色分配
      *

+ 6 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/client/org/SmsbDepartmentUserService.java

@@ -5,6 +5,7 @@ import com.alibaba.cola.dto.Response;
 import com.inspur.customer.object.keycloak.KeycloakUserCO;
 import com.inspur.customer.object.keycloak.SwitchDTO;
 import com.inspur.customer.object.org.*;
+import com.inspur.customer.object.tenant.SmsbUserTenantTransferDto;
 
 import java.util.List;
 import java.util.Map;
@@ -136,4 +137,9 @@ public interface SmsbDepartmentUserService {
      * @return
      */
     List<Integer> queryUserInformType(String userId);
+
+    /**
+     * 用户租户迁移
+     */
+    Response tenantTransfer(SmsbUserTenantTransferDto transferDto);
 }

+ 27 - 0
smsb-customer-manager-client/src/main/java/com/inspur/customer/object/tenant/SmsbUserTenantTransferDto.java

@@ -0,0 +1,27 @@
+package com.inspur.customer.object.tenant;
+
+import lombok.Data;
+
+import javax.validation.constraints.NotNull;
+import java.io.Serializable;
+import java.util.Map;
+
+/**
+ * @author fantingwei
+ * @Descriptiond 接收屏管家用户租户迁移的Dto
+ * @date 2024/1/5
+ */
+@Data
+public class SmsbUserTenantTransferDto implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * key为smsbUserId,value为对应用户对应的path
+     */
+    @NotNull(message = "smsbUserIdPathMap不能为空")
+    private Map<String, String> smsbUserIdPathMap;
+
+    @NotNull(message = "用户的租户信息不能为空")
+    private String tenant;
+
+}