feat: OAuth update

This commit is contained in:
landaiqing
2024-05-27 21:16:21 +08:00
parent e40ae83c6f
commit 1618807b80
7 changed files with 109 additions and 110 deletions

View File

@@ -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("用户信息过期或回去失败!");
}

View File

@@ -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;

View File

@@ -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查询用户信息

View File

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

View File

@@ -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

View File

@@ -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();

View File

@@ -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) {