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}` });