diff --git a/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java b/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java
index 67f4e15a..631f7a1c 100644
--- a/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java
+++ b/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java
@@ -39,7 +39,6 @@ public class KiccUser extends User {
* 多租户ID
*/
@Getter
- @Setter
private String tenantId;
public KiccUser(String id, String deptId, String username, String password, String phone, String tenantId, boolean enabled,
diff --git a/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/handler/KiccTenantLineHandler.java b/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/handler/KiccTenantLineHandler.java
index 60d0948c..03e681b3 100644
--- a/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/handler/KiccTenantLineHandler.java
+++ b/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/handler/KiccTenantLineHandler.java
@@ -1,10 +1,12 @@
package com.cloud.kicc.common.data.handler;
import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.cloud.kicc.common.data.entity.KiccUser;
import com.cloud.kicc.common.data.override.TenantLikeExpression;
import com.cloud.kicc.common.data.properties.TenantProperties;
+import com.cloud.kicc.common.data.util.TenantContextHolder;
import net.sf.jsqlparser.expression.Expression;
import net.sf.jsqlparser.schema.Column;
import org.springframework.security.core.Authentication;
@@ -57,7 +59,7 @@ public class KiccTenantLineHandler implements TenantLineHandler {
@Override
public Expression getTenantId() {
// 返回当前用户所属的多租户ID进行条件拼接
- return ObjectUtil.isNotEmpty(getUser()) ? new TenantLikeExpression(getUser().getTenantId()) : null;
+ return StrUtil.isNotBlank(TenantContextHolder.getTenant()) ? new TenantLikeExpression(TenantContextHolder.getTenant()): null;
}
/**
diff --git a/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/util/TenantContextHolder.java b/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/util/TenantContextHolder.java
new file mode 100644
index 00000000..307dbfd8
--- /dev/null
+++ b/kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/util/TenantContextHolder.java
@@ -0,0 +1,51 @@
+package com.cloud.kicc.common.data.util;
+
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
+import com.cloud.kicc.common.data.entity.KiccUser;
+import com.cloud.kicc.common.data.override.TenantLikeExpression;
+import lombok.experimental.UtilityClass;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.context.SecurityContextHolder;
+
+import java.util.Optional;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ *
+ * 动态设置多租户
+ *
+ *
+ * @Author: entfrm开发团队-王翔
+ * @Date: 2022/5/13
+ */
+@UtilityClass
+public class TenantContextHolder {
+
+ private final AtomicReference contextHolder = new AtomicReference("");
+
+ public void setTenant(String tenantIds) {
+ contextHolder.set(tenantIds);
+ }
+
+ public String getTenant() {
+ String tenantIds = ObjectUtil.isNotEmpty(getUser()) ? getUser().getTenantId() : null;
+ return StrUtil.isNotBlank(contextHolder.get()) ? contextHolder.get() : tenantIds;
+ }
+
+ /**
+ * 获取用户
+ * 如果当前不存在用户,正常情况多租户拼接查询会报错
+ */
+ private KiccUser getUser() {
+ Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+ if (Optional.ofNullable(authentication).isPresent()) {
+ Object principal = authentication.getPrincipal();
+ if (principal instanceof KiccUser) {
+ return (KiccUser) principal;
+ }
+ }
+ return null;
+ }
+
+}
diff --git a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java
index f3aab7b4..9d14f553 100644
--- a/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java
+++ b/kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java
@@ -8,7 +8,12 @@ import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.AppConstants;
+import com.cloud.kicc.common.core.constant.CacheConstants;
+import com.cloud.kicc.common.core.constant.CommonConstants;
+import com.cloud.kicc.common.core.constant.SecurityConstants;
+import com.cloud.kicc.common.core.util.SpringContextHolderUtil;
import com.cloud.kicc.common.data.entity.KiccUser;
+import com.cloud.kicc.common.data.util.TenantContextHolder;
import com.cloud.kicc.common.log.annotation.SysLog;
import com.cloud.kicc.common.security.annotation.Inner;
import com.cloud.kicc.common.security.util.SecurityUtils;
@@ -23,14 +28,34 @@ import com.cloud.kicc.system.service.UserService;
import com.pig4cloud.plugin.excel.annotation.ResponseExcel;
import com.pig4cloud.plugin.excel.annotation.Sheet;
import lombok.RequiredArgsConstructor;
+import org.springframework.data.redis.connection.RedisConnection;
+import org.springframework.data.redis.connection.RedisConnectionFactory;
+import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.GrantedAuthority;
+import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.security.oauth2.client.OAuth2ClientContext;
+import org.springframework.security.oauth2.common.DefaultOAuth2AccessToken;
+import org.springframework.security.oauth2.common.OAuth2AccessToken;
+import org.springframework.security.oauth2.provider.OAuth2Authentication;
+import org.springframework.security.oauth2.provider.token.AuthenticationKeyGenerator;
+import org.springframework.security.oauth2.provider.token.DefaultAuthenticationKeyGenerator;
+import org.springframework.security.oauth2.provider.token.TokenStore;
+import org.springframework.security.oauth2.provider.token.store.redis.JdkSerializationStrategy;
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStore;
+import org.springframework.security.oauth2.provider.token.store.redis.RedisTokenStoreSerializationStrategy;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
-import java.util.Arrays;
-import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpSession;
+import java.util.*;
import java.util.stream.Collectors;
/**
@@ -205,11 +230,12 @@ public class UserController {
return userService.list();
}
+
@SysLog("用户多租户更改")
- @PutMapping("/changeTenant")
+ @GetMapping("/changeTenant/{tenantIds:[\\w,]+}")
@PreAuthorize("@pms.hasPermission('user_edit')")
- public R changeTenant(String[] tenantIds) {
- SecurityUtils.getUser().setTenantId(String.join(",", tenantIds));
+ public R changeTenant(@PathVariable String[] tenantIds, HttpServletRequest request) {
+ TenantContextHolder.setTenant("123");
return R.ok();
}
diff --git a/kicc-ui/src/api/platform/system/controller/user.ts b/kicc-ui/src/api/platform/system/controller/user.ts
index 39e85cfe..672dcfbe 100644
--- a/kicc-ui/src/api/platform/system/controller/user.ts
+++ b/kicc-ui/src/api/platform/system/controller/user.ts
@@ -45,4 +45,4 @@ export const resetPwd = (params: Partial) => defHttp.put({ url: Api.resetP
export const changeStatus = (id: string, status: string) => defHttp.put({ url: Api.changeStatus, data: { id: id, status: status } });
/** 修改用户多租户 */
-export const changeTenant = (tenantIds: string[]) => defHttp.get({ url: Api.changeTenant, params: { tenantIds } });
+export const changeTenant = (tenantIds: string[]) => defHttp.get({ url: `${Api.changeTenant}/${tenantIds}` });