Browse Source

👣 重构底层多租户

master
wangxiang 3 years ago
parent
commit
be8076cd77
  1. 1
      kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/entity/KiccUser.java
  2. 4
      kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/handler/KiccTenantLineHandler.java
  3. 51
      kicc-common/kicc-common-data/src/main/java/com/cloud/kicc/common/data/util/TenantContextHolder.java
  4. 36
      kicc-platform/kicc-platform-biz/kicc-system-biz/src/main/java/com/cloud/kicc/system/controller/UserController.java
  5. 2
      kicc-ui/src/api/platform/system/controller/user.ts

1
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 * 多租户ID
*/ */
@Getter @Getter
@Setter
private String tenantId; private String tenantId;
public KiccUser(String id, String deptId, String username, String password, String phone, String tenantId, boolean enabled, public KiccUser(String id, String deptId, String username, String password, String phone, String tenantId, boolean enabled,

4
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; package com.cloud.kicc.common.data.handler;
import cn.hutool.core.util.ObjectUtil; import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler; import com.baomidou.mybatisplus.extension.plugins.handler.TenantLineHandler;
import com.cloud.kicc.common.data.entity.KiccUser; import com.cloud.kicc.common.data.entity.KiccUser;
import com.cloud.kicc.common.data.override.TenantLikeExpression; import com.cloud.kicc.common.data.override.TenantLikeExpression;
import com.cloud.kicc.common.data.properties.TenantProperties; 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.expression.Expression;
import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Column;
import org.springframework.security.core.Authentication; import org.springframework.security.core.Authentication;
@ -57,7 +59,7 @@ public class KiccTenantLineHandler implements TenantLineHandler {
@Override @Override
public Expression getTenantId() { public Expression getTenantId() {
// 返回当前用户所属的多租户ID进行条件拼接 // 返回当前用户所属的多租户ID进行条件拼接
return ObjectUtil.isNotEmpty(getUser()) ? new TenantLikeExpression(getUser().getTenantId()) : null; return StrUtil.isNotBlank(TenantContextHolder.getTenant()) ? new TenantLikeExpression(TenantContextHolder.getTenant()): null;
} }
/** /**

51
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;
/**
*<p>
* 动态设置多租户
*</p>
*
* @Author: entfrm开发团队-王翔
* @Date: 2022/5/13
*/
@UtilityClass
public class TenantContextHolder {
private final AtomicReference<String> 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;
}
}

36
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.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.cloud.kicc.common.core.api.R; import com.cloud.kicc.common.core.api.R;
import com.cloud.kicc.common.core.constant.AppConstants; 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.entity.KiccUser;
import com.cloud.kicc.common.data.util.TenantContextHolder;
import com.cloud.kicc.common.log.annotation.SysLog; import com.cloud.kicc.common.log.annotation.SysLog;
import com.cloud.kicc.common.security.annotation.Inner; import com.cloud.kicc.common.security.annotation.Inner;
import com.cloud.kicc.common.security.util.SecurityUtils; 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.ResponseExcel;
import com.pig4cloud.plugin.excel.annotation.Sheet; import com.pig4cloud.plugin.excel.annotation.Sheet;
import lombok.RequiredArgsConstructor; 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.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.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder; 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.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile; import org.springframework.web.multipart.MultipartFile;
import java.util.Arrays; import javax.servlet.http.HttpServletRequest;
import java.util.List; import javax.servlet.http.HttpSession;
import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
@ -205,11 +230,12 @@ public class UserController {
return userService.list(); return userService.list();
} }
@SysLog("用户多租户更改") @SysLog("用户多租户更改")
@PutMapping("/changeTenant") @GetMapping("/changeTenant/{tenantIds:[\\w,]+}")
@PreAuthorize("@pms.hasPermission('user_edit')") @PreAuthorize("@pms.hasPermission('user_edit')")
public R changeTenant(String[] tenantIds) { public R changeTenant(@PathVariable String[] tenantIds, HttpServletRequest request) {
SecurityUtils.getUser().setTenantId(String.join(",", tenantIds)); TenantContextHolder.setTenant("123");
return R.ok(); return R.ok();
} }

2
kicc-ui/src/api/platform/system/controller/user.ts

@ -45,4 +45,4 @@ export const resetPwd = (params: Partial<User>) => defHttp.put({ url: Api.resetP
export const changeStatus = (id: string, status: string) => defHttp.put({ url: Api.changeStatus, data: { id: id, status: status } }); 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}` });

Loading…
Cancel
Save