feat: OAuth update
This commit is contained in:
@@ -10,6 +10,7 @@ import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import me.zhyd.oauth.model.AuthCallback;
|
||||
import me.zhyd.oauth.model.AuthResponse;
|
||||
import me.zhyd.oauth.model.AuthToken;
|
||||
import me.zhyd.oauth.model.AuthUser;
|
||||
import me.zhyd.oauth.request.AuthRequest;
|
||||
import me.zhyd.oauth.utils.AuthStateUtils;
|
||||
@@ -47,8 +48,6 @@ public class SchisandraOauthController {
|
||||
@Value("${web.url}")
|
||||
private String url;
|
||||
|
||||
private static final String OAUTH_KEY_PREFIX = "oauth.user";
|
||||
|
||||
|
||||
/**
|
||||
* @description: 获取授权链接并跳转到第三方授权页面
|
||||
@@ -84,23 +83,13 @@ public class SchisandraOauthController {
|
||||
AuthRequest authRequest = getAuthRequest(type);
|
||||
AuthResponse<AuthUser> authResponse = authRequest.login(callback);
|
||||
AuthUser data = authResponse.getData();
|
||||
schisandraAuthUserDomainService.insertAuthUserByOauth(data, type);
|
||||
response.sendRedirect(url + "loading");
|
||||
}
|
||||
|
||||
@GetMapping("userInfo")
|
||||
public Result getUserInfo() {
|
||||
String tokenValue = StpUtil.getTokenValue();
|
||||
String key = redisUtil.buildKey(OAUTH_KEY_PREFIX, tokenValue);
|
||||
if (redisUtil.exist(key)) {
|
||||
String userId = redisUtil.get(key);
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("userId", userId);
|
||||
map.put("token", tokenValue);
|
||||
return Result.ok(map);
|
||||
AuthToken token = data.getToken();
|
||||
Result result = schisandraAuthUserDomainService.insertAuthUserByOauth(data, type);
|
||||
if (result.getSuccess()){
|
||||
response.sendRedirect(url + "loading?token=" + token.getAccessToken() + "&userId=" + StpUtil.getLoginIdAsString());
|
||||
}else{
|
||||
log.error("登录失败");
|
||||
}
|
||||
return Result.fail("用户信息过期或回去失败!");
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@@ -17,35 +17,35 @@ public enum OauthType {
|
||||
/**
|
||||
* 微信登录
|
||||
*/
|
||||
WECHAT("WECHAT"),
|
||||
WECHAT("wechat"),
|
||||
/**
|
||||
* QQ登录
|
||||
*/
|
||||
QQ("QQ"),
|
||||
QQ("qq"),
|
||||
/**
|
||||
* 微博登录
|
||||
*/
|
||||
WEIBO("WEIBO"),
|
||||
WEIBO("weibo"),
|
||||
/**
|
||||
* 支付宝登录
|
||||
*/
|
||||
ALIPAY("ALIPAY"),
|
||||
ALIPAY("alipay"),
|
||||
/**
|
||||
* 钉钉登录
|
||||
*/
|
||||
DINGTALK("DINGTALK"),
|
||||
DINGTALK("dingtalk"),
|
||||
/**
|
||||
* 企业微信登录
|
||||
*/
|
||||
WORK_WEIXIN("WORK_WEIXIN"),
|
||||
WORK_WEIXIN("work_weixin"),
|
||||
/**
|
||||
* Github
|
||||
*/
|
||||
GitHUB("GITHUB"),
|
||||
GitHUB("github"),
|
||||
/**
|
||||
* Gitee
|
||||
*/
|
||||
Gitee("GITEE");
|
||||
Gitee("gitee");
|
||||
|
||||
public String type;
|
||||
|
||||
|
@@ -1,6 +1,7 @@
|
||||
package com.schisandra.auth.domain.service;
|
||||
|
||||
|
||||
import com.schisandra.auth.common.entity.Result;
|
||||
import com.schisandra.auth.domain.bo.SchisandraAuthUserBO;
|
||||
import me.zhyd.oauth.model.AuthUser;
|
||||
|
||||
@@ -46,7 +47,7 @@ public interface SchisandraAuthUserDomainService {
|
||||
* @author: landaiqing
|
||||
* @date: 2024/5/26 17:27
|
||||
*/
|
||||
void insertAuthUserByOauth(AuthUser data, String type);
|
||||
Result insertAuthUserByOauth(AuthUser data, String type);
|
||||
|
||||
/**
|
||||
* @description: 通过id查询用户信息
|
||||
|
@@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.SaLoginConfig;
|
||||
import cn.dev33.satoken.stp.SaTokenInfo;
|
||||
import cn.dev33.satoken.stp.StpUtil;
|
||||
import com.alibaba.fastjson.JSONObject;
|
||||
import com.schisandra.auth.common.entity.Result;
|
||||
import com.schisandra.auth.common.enums.IsDeletedFlagEnum;
|
||||
import com.schisandra.auth.common.enums.UserRoleEnum;
|
||||
import com.schisandra.auth.common.enums.UserStatusEnum;
|
||||
@@ -163,12 +164,49 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
*/
|
||||
@Override
|
||||
@Transactional
|
||||
public void insertAuthUserByOauth(AuthUser data, String type) {
|
||||
public Result insertAuthUserByOauth(AuthUser data, String type) {
|
||||
String uuid = data.getUuid();
|
||||
AuthToken token = data.getToken();
|
||||
SchisandraAuthSocialUser authSocialUser = schisandraAuthSocialUserService.selectByUuidAndType(uuid, type);
|
||||
Long socialUserId = authSocialUser.getId();
|
||||
if (ObjectUtils.isEmpty(authSocialUser)) {
|
||||
if (ObjectUtils.isNotEmpty(authSocialUser)) {
|
||||
// 更新社会用户信息表
|
||||
SchisandraAuthSocialUserBO schisandraAuthSocialUserBO = new SchisandraAuthSocialUserBO();
|
||||
schisandraAuthSocialUserBO.setAccessToken(token.getAccessToken());
|
||||
schisandraAuthSocialUserBO.setSource(data.getSource());
|
||||
schisandraAuthSocialUserBO.setUid(token.getUid());
|
||||
schisandraAuthSocialUserBO.setOpenId(token.getOpenId());
|
||||
schisandraAuthSocialUserBO.setCode(token.getCode());
|
||||
schisandraAuthSocialUserBO.setAccessCode(token.getAccessCode());
|
||||
schisandraAuthSocialUserBO.setExpireIn(token.getExpireIn());
|
||||
schisandraAuthSocialUserBO.setIdToken(token.getIdToken());
|
||||
schisandraAuthSocialUserBO.setMacAlgorithm(token.getMacAlgorithm());
|
||||
schisandraAuthSocialUserBO.setMacKey(token.getMacKey());
|
||||
schisandraAuthSocialUserBO.setOauthToken(token.getOauthToken());
|
||||
schisandraAuthSocialUserBO.setOauthTokenSecret(token.getOauthTokenSecret());
|
||||
schisandraAuthSocialUserBO.setRefreshToken(token.getRefreshToken());
|
||||
schisandraAuthSocialUserBO.setId(authSocialUser.getId());
|
||||
SchisandraAuthSocialUser schisandraAuthSocialUser = SchisandraAuthSocialUserBOConverter.INSTANCE.convertBOToEntity(schisandraAuthSocialUserBO);
|
||||
int update = schisandraAuthSocialUserService.updateByOauth(schisandraAuthSocialUser);
|
||||
if (update <= 0) {
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("schisandraAuthSocialUserService.update fail, param:{}", JSONObject.toJSONString(schisandraAuthSocialUser));
|
||||
}
|
||||
return Result.fail("Social User update fail");
|
||||
}
|
||||
SchisandraAuthSocialUserMapper schisandraAuthSocialUserMapper = new SchisandraAuthSocialUserMapper();
|
||||
schisandraAuthSocialUserMapper.setSocialUserId(authSocialUser.getId());
|
||||
SchisandraAuthSocialUserMapper result = schisandraAuthSocialUserMapperService.queryByCondition(schisandraAuthSocialUserMapper);
|
||||
if (ObjectUtils.isEmpty(result)) {
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("schisandraAuthSocialUserMapperService.queryByCondition fail, param:{}", JSONObject.toJSONString(schisandraAuthSocialUserMapper));
|
||||
}
|
||||
return Result.fail("Social Mapper is empty");
|
||||
}
|
||||
Long userId = result.getUserId();
|
||||
StpUtil.login(userId, SaLoginConfig.setToken(token.getAccessToken()));
|
||||
return Result.ok();
|
||||
} else {
|
||||
// 插入用户信息表
|
||||
SchisandraAuthUserBO schisandraAuthUserBO = new SchisandraAuthUserBO();
|
||||
schisandraAuthUserBO.setAvatar(data.getAvatar());
|
||||
schisandraAuthUserBO.setBlog(data.getBlog());
|
||||
@@ -187,8 +225,9 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("insertAuthUserByOauth fail, param:{}", JSONObject.toJSONString(schisandraAuthUser));
|
||||
}
|
||||
return;
|
||||
return Result.fail("insertAuthUserByOauth.insertAuthUserByOauth fail");
|
||||
}
|
||||
// 插入社会用户信息表
|
||||
SchisandraAuthSocialUserBO schisandraAuthSocialUserBO = new SchisandraAuthSocialUserBO();
|
||||
schisandraAuthSocialUserBO.setUuid(data.getUuid());
|
||||
schisandraAuthSocialUserBO.setAccessToken(token.getAccessToken());
|
||||
@@ -215,11 +254,12 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("insertAuthSocialUserByOauth fail, param:{}", JSONObject.toJSONString(schisandraAuthSocialUserBO));
|
||||
}
|
||||
return;
|
||||
return Result.fail("schisandraAuthSocialUserService insert fail");
|
||||
}
|
||||
Long authUserId = schisandraAuthUser.getId();
|
||||
Long authSocialUserId = schisandraAuthSocialUserBO.getId();
|
||||
|
||||
// 建立用户与社会信息映射关系
|
||||
Long authUserId = schisandraAuthUser.getId();
|
||||
Long authSocialUserId = schisandraAuthSocialUser.getId();
|
||||
SchisandraAuthSocialUserMapperBO schisandraAuthSocialUserMapperBO = new SchisandraAuthSocialUserMapperBO();
|
||||
schisandraAuthSocialUserMapperBO.setUserId(authUserId);
|
||||
schisandraAuthSocialUserMapperBO.setSocialUserId(authSocialUserId);
|
||||
@@ -230,8 +270,9 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("insertAuthSocialUserMapperByOauth fail, param:{}", JSONObject.toJSONString(schisandraAuthSocialUserMapperBO));
|
||||
}
|
||||
return;
|
||||
return Result.fail("insertAuthSocialUserMapperByOauth fail");
|
||||
}
|
||||
// 建立用户与角色映射关系
|
||||
SchisandraAuthUserRoleBO schisandraAuthUserRoleBO = new SchisandraAuthUserRoleBO();
|
||||
schisandraAuthUserRoleBO.setUserId(authUserId);
|
||||
schisandraAuthUserRoleBO.setRoleId((long) UserRoleEnum.normal_user.getCode());
|
||||
@@ -242,43 +283,12 @@ public class SchisandraAuthUserDomainServiceImpl implements SchisandraAuthUserDo
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("insertUserRole fail, param:{}", JSONObject.toJSONString(schisandraAuthUserRole));
|
||||
}
|
||||
return;
|
||||
return Result.fail("insertUserRole fail");
|
||||
}
|
||||
StpUtil.login(data.getUuid(), SaLoginConfig.setToken(token.getAccessToken()));
|
||||
String key = redisUtil.buildKey(OAUTH_KEY_PREFIX, token.getAccessToken()+"."+token.getUid());
|
||||
redisUtil.setNx(key, String.valueOf(authUserId), 60L * 5, SECONDS);
|
||||
StpUtil.login(authUserId, SaLoginConfig.setToken(token.getAccessToken()));
|
||||
return Result.ok();
|
||||
}
|
||||
SchisandraAuthSocialUserBO schisandraAuthSocialUserBO = new SchisandraAuthSocialUserBO();
|
||||
schisandraAuthSocialUserBO.setAccessToken(token.getAccessToken());
|
||||
schisandraAuthSocialUserBO.setSource(data.getSource());
|
||||
schisandraAuthSocialUserBO.setUid(token.getUid());
|
||||
schisandraAuthSocialUserBO.setOpenId(token.getOpenId());
|
||||
schisandraAuthSocialUserBO.setCode(token.getCode());
|
||||
schisandraAuthSocialUserBO.setAccessCode(token.getAccessCode());
|
||||
schisandraAuthSocialUserBO.setExpireIn(token.getExpireIn());
|
||||
schisandraAuthSocialUserBO.setIdToken(token.getIdToken());
|
||||
schisandraAuthSocialUserBO.setMacAlgorithm(token.getMacAlgorithm());
|
||||
schisandraAuthSocialUserBO.setMacKey(token.getMacKey());
|
||||
schisandraAuthSocialUserBO.setOauthToken(token.getOauthToken());
|
||||
schisandraAuthSocialUserBO.setOauthTokenSecret(token.getOauthTokenSecret());
|
||||
schisandraAuthSocialUserBO.setRefreshToken(token.getRefreshToken());
|
||||
schisandraAuthSocialUserBO.setId(socialUserId);
|
||||
SchisandraAuthSocialUser schisandraAuthSocialUser = SchisandraAuthSocialUserBOConverter.INSTANCE.convertBOToEntity(schisandraAuthSocialUserBO);
|
||||
int update = schisandraAuthSocialUserService.updateByOauth(schisandraAuthSocialUser);
|
||||
if (update <= 0) {
|
||||
if (log.isInfoEnabled()) {
|
||||
log.error("schisandraAuthSocialUserService.update fail, param:{}", JSONObject.toJSONString(schisandraAuthSocialUser));
|
||||
}
|
||||
return;
|
||||
}
|
||||
Long socialId = schisandraAuthSocialUser.getId();
|
||||
SchisandraAuthSocialUserMapper schisandraAuthSocialUserMapper = new SchisandraAuthSocialUserMapper();
|
||||
schisandraAuthSocialUserMapper.setSocialUserId(socialId);
|
||||
SchisandraAuthSocialUserMapper result = schisandraAuthSocialUserMapperService.queryByCondition(schisandraAuthSocialUserMapper);
|
||||
Long userId = result.getUserId();
|
||||
StpUtil.login(data.getUuid(), SaLoginConfig.setToken(token.getAccessToken()));
|
||||
String key = redisUtil.buildKey(OAUTH_KEY_PREFIX, token.getAccessToken()+"."+token.getUid());
|
||||
redisUtil.setNx(key, String.valueOf(userId), 60L * 5, SECONDS);
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -61,7 +61,7 @@ sa-token:
|
||||
# token 最低活跃频率(单位:秒),如果 token 超过此时间没有访问系统就会被冻结,默认-1 代表不限制,永不冻结
|
||||
active-timeout: -1
|
||||
# 是否允许同一账号多地同时登录 (为 true 时允许一起登录, 为 false 时新登录挤掉旧登录)
|
||||
is-concurrent: true
|
||||
is-concurrent: false
|
||||
# 在多人登录同一账号时,是否共用一个 token (为 true 时所有登录共用一个 token, 为 false 时每次登录新建一个 token)
|
||||
is-share: true
|
||||
# token 风格(默认可取值:uuid、simple-uuid、random-32、random-64、random-128、tik)
|
||||
|
@@ -40,7 +40,6 @@ public class SchisandraOssMinioController {
|
||||
@Resource
|
||||
RedisUtil redisUtil;
|
||||
|
||||
private final String MINIO_OSS_CLIENT_CONFIG_KEY = "oss.minio.init";
|
||||
|
||||
/**
|
||||
* @description: minio 初始化
|
||||
@@ -51,29 +50,25 @@ public class SchisandraOssMinioController {
|
||||
*/
|
||||
@PostMapping("init")
|
||||
public void initMinio(@RequestParam String userId) {
|
||||
|
||||
if (log.isInfoEnabled()) {
|
||||
log.info("SchisandraOssMinioController.init.userId:{}", userId);
|
||||
}
|
||||
Preconditions.checkNotNull(userId, "用户id不能为空!");
|
||||
try {
|
||||
String key = redisUtil.buildKey(MINIO_OSS_CLIENT_CONFIG_KEY, userId);
|
||||
boolean exists = redisUtil.exist(key);
|
||||
if (exists) {
|
||||
log.info("用户: " + userId + "-> minio 已经初始化!");
|
||||
return;
|
||||
}
|
||||
minioOssConfiguration.minioOssClient(userId);
|
||||
|
||||
Result result = minioOssConfiguration.minioOssClient(userId);
|
||||
if (result.getSuccess()) {
|
||||
log.info("用户: " + userId + "-> minio 初始化完成!");
|
||||
} catch (Exception e) {
|
||||
log.error("用户: " + userId + "-> minio 初始化失败!", e.getMessage(), e);
|
||||
} else {
|
||||
log.error("用户: " + userId + "-> minio 初始化完成!");
|
||||
}
|
||||
}
|
||||
|
||||
@NeedDecrypt
|
||||
@PostMapping("get")
|
||||
public SchisandraOssMinioDTO getMinioOss(@RequestParam String userId) {
|
||||
return SchisandraOssMinioDTOConverter.INSTANCE.convertBOToDTO(schisandraOssMinioDomainService.getMinioConfig(Long.valueOf(userId)));
|
||||
}
|
||||
|
||||
/**
|
||||
* 新增
|
||||
*/
|
||||
@@ -146,6 +141,7 @@ public class SchisandraOssMinioController {
|
||||
}
|
||||
return Result.ok(bean.getBaseInfo(fileName));
|
||||
}
|
||||
|
||||
@GetMapping("getAllMinioInfo")
|
||||
public Result<List<SchisandraOssMinioDTO>> getAllMinioInfo() {
|
||||
List<SchisandraOssMinioBO> allMinioInfo = schisandraOssMinioDomainService.getAllMinioInfo();
|
||||
|
@@ -7,6 +7,7 @@ import com.schisandra.oss.application.dto.SchisandraOssMinioDTO;
|
||||
import com.schisandra.oss.application.oss.core.StandardOssClient;
|
||||
import com.schisandra.oss.application.oss.core.minio.model.MinioOssClientConfig;
|
||||
import com.schisandra.oss.application.oss.core.minio.model.MinioOssConfig;
|
||||
import com.schisandra.oss.common.entity.Result;
|
||||
import com.schisandra.oss.common.redis.RedisUtil;
|
||||
import com.schisandra.oss.domain.bo.SchisandraOssMinioBO;
|
||||
import com.schisandra.oss.domain.service.SchisandraOssMinioDomainService;
|
||||
@@ -37,36 +38,38 @@ public class MinioOssConfiguration {
|
||||
@Resource
|
||||
private SchisandraOssMinioDomainService schisandraOssMinioDomainService;
|
||||
|
||||
public StandardOssClient minioOssClient(String userId) {
|
||||
SchisandraOssMinioDTO minio = minioOssConfiguration.getSchisandraOssMinioDTO(userId);
|
||||
if (minio == null) return null;
|
||||
MinioOssConfig minioOssConfig = new MinioOssConfig();
|
||||
minioOssConfig.setBasePath(minio.getBasePath());
|
||||
minioOssConfig.setBucketName(minio.getBucketName());
|
||||
minioOssConfig.setAccessKey(minio.getAccessKey());
|
||||
minioOssConfig.setSecretKey(minio.getSecretKey());
|
||||
minioOssConfig.setEndpoint(minio.getEndpoint());
|
||||
minioOssConfig.init();
|
||||
if (Boolean.parseBoolean(minio.getOpenAdvancedSetup())) {
|
||||
MinioOssClientConfig minioOssClientConfig = new MinioOssClientConfig();
|
||||
minioOssClientConfig.setWriteTimeout(minio.getWriteTimeout());
|
||||
minioOssClientConfig.setConnectTimeout(minio.getConnectTimeout());
|
||||
minioOssClientConfig.setReadTimeout(minio.getReadTimeout());
|
||||
minioOssClientConfig.setFollowSslRedirects(Boolean.parseBoolean(minio.getFollowSslRedirects()));
|
||||
minioOssClientConfig.setRetryOnConnectionFailure(Boolean.parseBoolean(minio.getRetryOnConnectionFailure()));
|
||||
minioOssClientConfig.setPingInterval(minio.getPingInterval());
|
||||
minioOssClientConfig.setFollowRedirects(Boolean.parseBoolean(minio.getFollowRedirects()));
|
||||
minioOssClientConfig.setCallTimeout(minio.getCallTimeout());
|
||||
minioOssConfig.setClientConfig(minioOssClientConfig);
|
||||
public Result minioOssClient(String userId) {
|
||||
try {
|
||||
SchisandraOssMinioDTO minio = minioOssConfiguration.getSchisandraOssMinioDTO(userId);
|
||||
if (minio == null) return null;
|
||||
MinioOssConfig minioOssConfig = new MinioOssConfig();
|
||||
minioOssConfig.setBasePath(minio.getBasePath());
|
||||
minioOssConfig.setBucketName(minio.getBucketName());
|
||||
minioOssConfig.setAccessKey(minio.getAccessKey());
|
||||
minioOssConfig.setSecretKey(minio.getSecretKey());
|
||||
minioOssConfig.setEndpoint(minio.getEndpoint());
|
||||
minioOssConfig.init();
|
||||
if (Boolean.parseBoolean(minio.getOpenAdvancedSetup())) {
|
||||
MinioOssClientConfig minioOssClientConfig = new MinioOssClientConfig();
|
||||
minioOssClientConfig.setWriteTimeout(minio.getWriteTimeout());
|
||||
minioOssClientConfig.setConnectTimeout(minio.getConnectTimeout());
|
||||
minioOssClientConfig.setReadTimeout(minio.getReadTimeout());
|
||||
minioOssClientConfig.setFollowSslRedirects(Boolean.parseBoolean(minio.getFollowSslRedirects()));
|
||||
minioOssClientConfig.setRetryOnConnectionFailure(Boolean.parseBoolean(minio.getRetryOnConnectionFailure()));
|
||||
minioOssClientConfig.setPingInterval(minio.getPingInterval());
|
||||
minioOssClientConfig.setFollowRedirects(Boolean.parseBoolean(minio.getFollowRedirects()));
|
||||
minioOssClientConfig.setCallTimeout(minio.getCallTimeout());
|
||||
minioOssConfig.setClientConfig(minioOssClientConfig);
|
||||
}
|
||||
SpringUtil.registerBean(userId, minioOssClient(minioOssConfig));
|
||||
return Result.ok();
|
||||
} catch (Exception e) {
|
||||
log.error("MinioOssConfiguration.minioOssClient:{}", e.getMessage(), e);
|
||||
return Result.fail();
|
||||
}
|
||||
SpringUtil.registerBean(userId,minioOssClient(minioOssConfig));
|
||||
return minioOssClient(minioOssConfig);
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@NeedDecrypt
|
||||
public SchisandraOssMinioDTO getSchisandraOssMinioDTO(String userId) {
|
||||
CompletableFuture<SchisandraOssMinioDTO> futurePrice = CompletableFuture.supplyAsync(() -> {
|
||||
@@ -83,7 +86,7 @@ public class MinioOssConfiguration {
|
||||
}
|
||||
|
||||
public StandardOssClient minioOssClient(MinioOssConfig minioOssConfig) {
|
||||
return new MinioOssClient(minioClient(minioOssConfig),minioOssConfig);
|
||||
return new MinioOssClient(minioClient(minioOssConfig), minioOssConfig);
|
||||
}
|
||||
|
||||
public MinioClient minioClient(MinioOssConfig minioOssConfig) {
|
||||
|
Reference in New Issue
Block a user