diff --git a/pom.xml b/pom.xml index 1cfee0b..72b9a49 100644 --- a/pom.xml +++ b/pom.xml @@ -38,7 +38,6 @@ 0.2.0 1.18.30 1.76 - 1.16.6 2.7.0 @@ -107,13 +106,6 @@ import - - - me.zhyd.oauth - JustAuth - ${justauth.version} - - org.springdoc springdoc-openapi-starter-webmvc-api @@ -426,11 +418,6 @@ test - - me.zhyd.oauth - JustAuth - - org.projectlombok lombok diff --git a/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java b/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java deleted file mode 100644 index 0d1b121..0000000 --- a/src/main/java/org/dromara/common/core/domain/model/SocialLoginBody.java +++ /dev/null @@ -1,35 +0,0 @@ -package org.dromara.common.core.domain.model; - -import jakarta.validation.constraints.NotBlank; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 三方登录对象 - * - * @author Lion Li - */ - -@Data -@EqualsAndHashCode(callSuper = true) -public class SocialLoginBody extends LoginBody { - - /** - * 第三方登录平台 - */ - @NotBlank(message = "{social.source.not.blank}") - private String source; - - /** - * 第三方登录code - */ - @NotBlank(message = "{social.code.not.blank}") - private String socialCode; - - /** - * 第三方登录socialState - */ - @NotBlank(message = "{social.state.not.blank}") - private String socialState; - -} diff --git a/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java b/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java deleted file mode 100644 index 8314acc..0000000 --- a/src/main/java/org/dromara/common/social/config/SocialAutoConfiguration.java +++ /dev/null @@ -1,24 +0,0 @@ -package org.dromara.common.social.config; - -import me.zhyd.oauth.cache.AuthStateCache; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.utils.AuthRedisStateCache; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; - -/** - * Social 配置属性 - * @author thiszhc - */ -@Configuration -@EnableConfigurationProperties(SocialProperties.class) -public class SocialAutoConfiguration { - - @Bean - public AuthStateCache authStateCache() { - return new AuthRedisStateCache(); - } - -} diff --git a/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java b/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java deleted file mode 100644 index 76be234..0000000 --- a/src/main/java/org/dromara/common/social/config/properties/SocialLoginConfigProperties.java +++ /dev/null @@ -1,68 +0,0 @@ -package org.dromara.common.social.config.properties; - -import lombok.Data; - -/** - * 社交登录配置 - * - * @author thiszhc - */ -@Data -public class SocialLoginConfigProperties { - - /** - * 应用 ID - */ - private String clientId; - - /** - * 应用密钥 - */ - private String clientSecret; - - /** - * 回调地址 - */ - private String redirectUri; - - /** - * 是否获取unionId - */ - private boolean unionId; - - /** - * Coding 企业名称 - */ - private String codingGroupName; - - /** - * 支付宝公钥 - */ - private String alipayPublicKey; - - /** - * 企业微信应用ID - */ - private String agentId; - - /** - * stackoverflow api key - */ - private String stackOverflowKey; - - /** - * 设备ID - */ - private String deviceId; - - /** - * 客户端系统类型 - */ - private String clientOsType; - - /** - * maxkey 服务器地址 - */ - private String serverUrl; - -} diff --git a/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java b/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java deleted file mode 100644 index 1beb7d0..0000000 --- a/src/main/java/org/dromara/common/social/config/properties/SocialProperties.java +++ /dev/null @@ -1,29 +0,0 @@ -package org.dromara.common.social.config.properties; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -import java.util.Map; - -/** - * Social 配置属性 - * - * @author thiszhc - */ -@Data -@Component -@ConfigurationProperties(prefix = "justauth") -public class SocialProperties { - - /** - * 是否启用 - */ - private Boolean enabled; - - /** - * 授权类型 - */ - private Map type; - -} diff --git a/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java b/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java deleted file mode 100644 index b95c19e..0000000 --- a/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeyRequest.java +++ /dev/null @@ -1,80 +0,0 @@ -package org.dromara.common.social.maxkey; - -import cn.hutool.core.lang.Dict; -import me.zhyd.oauth.cache.AuthStateCache; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthToken; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthDefaultRequest; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.json.utils.JsonUtils; - -/** - * @author 长春叭哥 2023年03月26日 - */ -public class AuthMaxKeyRequest extends AuthDefaultRequest { - - public static final String SERVER_URL = SpringUtils.getProperty("justauth.type.maxkey.server-url"); - - /** - * 设定归属域 - */ - public AuthMaxKeyRequest(AuthConfig config) { - super(config, AuthMaxKeySource.MAXKEY); - } - - public AuthMaxKeyRequest(AuthConfig config, AuthStateCache authStateCache) { - super(config, AuthMaxKeySource.MAXKEY, authStateCache); - } - - @Override - protected AuthToken getAccessToken(AuthCallback authCallback) { - String body = doPostAuthorizationCode(authCallback.getCode()); - Dict object = JsonUtils.parseMap(body); - // oauth/token 验证异常 - if (object.containsKey("error")) { - throw new AuthException(object.getStr("error_description")); - } - // user 验证异常 - if (object.containsKey("message")) { - throw new AuthException(object.getStr("message")); - } - return AuthToken.builder() - .accessToken(object.getStr("access_token")) - .refreshToken(object.getStr("refresh_token")) - .idToken(object.getStr("id_token")) - .tokenType(object.getStr("token_type")) - .scope(object.getStr("scope")) - .build(); - } - - @Override - protected AuthUser getUserInfo(AuthToken authToken) { - String body = doGetUserInfo(authToken); - Dict object = JsonUtils.parseMap(body); - // oauth/token 验证异常 - if (object.containsKey("error")) { - throw new AuthException(object.getStr("error_description")); - } - // user 验证异常 - if (object.containsKey("message")) { - throw new AuthException(object.getStr("message")); - } - return AuthUser.builder() - .uuid(object.getStr("userId")) - .username(object.getStr("username")) - .nickname(object.getStr("displayName")) - .avatar(object.getStr("avatar_url")) - .blog(object.getStr("web_url")) - .company(object.getStr("organization")) - .location(object.getStr("location")) - .email(object.getStr("email")) - .remark(object.getStr("bio")) - .token(authToken) - .source(source.toString()) - .build(); - } - -} diff --git a/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java b/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java deleted file mode 100644 index 1ff57f7..0000000 --- a/src/main/java/org/dromara/common/social/maxkey/AuthMaxKeySource.java +++ /dev/null @@ -1,52 +0,0 @@ -package org.dromara.common.social.maxkey; - -import me.zhyd.oauth.config.AuthSource; -import me.zhyd.oauth.request.AuthDefaultRequest; - -/** - * Oauth2 默认接口说明 - * - * @author 长春叭哥 2023年03月26日 - * - */ -public enum AuthMaxKeySource implements AuthSource { - - /** - * 自己搭建的 maxkey 私服 - */ - MAXKEY { - - /** - * 授权的api - */ - @Override - public String authorize() { - return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/authorize"; - } - - /** - * 获取accessToken的api - */ - @Override - public String accessToken() { - return AuthMaxKeyRequest.SERVER_URL + "/sign/authz/oauth/v20/token"; - } - - /** - * 获取用户信息的api - */ - @Override - public String userInfo() { - return AuthMaxKeyRequest.SERVER_URL + "/sign/api/oauth/v20/me"; - } - - /** - * 平台对应的 AuthRequest 实现类,必须继承自 {@link AuthDefaultRequest} - */ - @Override - public Class getTargetClass() { - return AuthMaxKeyRequest.class; - } - - } -} diff --git a/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java b/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java deleted file mode 100644 index 0b6ec20..0000000 --- a/src/main/java/org/dromara/common/social/utils/AuthRedisStateCache.java +++ /dev/null @@ -1,61 +0,0 @@ -package org.dromara.common.social.utils; - -import lombok.AllArgsConstructor; -import me.zhyd.oauth.cache.AuthStateCache; -import org.dromara.common.core.constant.GlobalConstants; -import org.dromara.common.redis.utils.RedisUtils; - -import java.time.Duration; - -/** - * 授权状态缓存 - */ -@AllArgsConstructor -public class AuthRedisStateCache implements AuthStateCache { - - /** - * 存入缓存 - * - * @param key 缓存key - * @param value 缓存内容 - */ - @Override - public void cache(String key, String value) { - // 授权超时时间 默认三分钟 - RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key, value, Duration.ofMinutes(3)); - } - - /** - * 存入缓存 - * - * @param key 缓存key - * @param value 缓存内容 - * @param timeout 指定缓存过期时间(毫秒) - */ - @Override - public void cache(String key, String value, long timeout) { - RedisUtils.setCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key, value, Duration.ofMillis(timeout)); - } - - /** - * 获取缓存内容 - * - * @param key 缓存key - * @return 缓存内容 - */ - @Override - public String get(String key) { - return RedisUtils.getCacheObject(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key); - } - - /** - * 是否存在key,如果对应key的value值已过期,也返回false - * - * @param key 缓存key - * @return true:存在key,并且value没过期;false:key不存在或者已过期 - */ - @Override - public boolean containsKey(String key) { - return RedisUtils.hasKey(GlobalConstants.SOCIAL_AUTH_CODE_KEY + key); - } -} diff --git a/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/src/main/java/org/dromara/common/social/utils/SocialUtils.java deleted file mode 100644 index 51b7e13..0000000 --- a/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ /dev/null @@ -1,70 +0,0 @@ -package org.dromara.common.social.utils; - -import cn.hutool.core.util.ObjectUtil; -import me.zhyd.oauth.config.AuthConfig; -import me.zhyd.oauth.exception.AuthException; -import me.zhyd.oauth.model.AuthCallback; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.*; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.common.social.config.properties.SocialLoginConfigProperties; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.maxkey.AuthMaxKeyRequest; - -/** - * 认证授权工具类 - * - * @author thiszhc - */ -public class SocialUtils { - - private static final AuthRedisStateCache STATE_CACHE = SpringUtils.getBean(AuthRedisStateCache.class); - - @SuppressWarnings("unchecked") - public static AuthResponse loginAuth(String source, String code, String state, SocialProperties socialProperties) throws AuthException { - AuthRequest authRequest = getAuthRequest(source, socialProperties); - AuthCallback callback = new AuthCallback(); - callback.setCode(code); - callback.setState(state); - return authRequest.login(callback); - } - - public static AuthRequest getAuthRequest(String source, SocialProperties socialProperties) throws AuthException { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - throw new AuthException("不支持的第三方登录类型"); - } - AuthConfig.AuthConfigBuilder builder = AuthConfig.builder() - .clientId(obj.getClientId()) - .clientSecret(obj.getClientSecret()) - .redirectUri(obj.getRedirectUri()); - return switch (source.toLowerCase()) { - case "dingtalk" -> new AuthDingTalkRequest(builder.build(), STATE_CACHE); - case "baidu" -> new AuthBaiduRequest(builder.build(), STATE_CACHE); - case "github" -> new AuthGithubRequest(builder.build(), STATE_CACHE); - case "gitee" -> new AuthGiteeRequest(builder.build(), STATE_CACHE); - case "weibo" -> new AuthWeiboRequest(builder.build(), STATE_CACHE); - case "coding" -> new AuthCodingRequest(builder.build(), STATE_CACHE); - case "oschina" -> new AuthOschinaRequest(builder.build(), STATE_CACHE); - // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip - case "alipay_wallet" -> new AuthAlipayRequest(builder.build(), socialProperties.getType().get("alipay_wallet").getAlipayPublicKey(), STATE_CACHE); - case "qq" -> new AuthQqRequest(builder.build(), STATE_CACHE); - case "wechat_open" -> new AuthWeChatOpenRequest(builder.build(), STATE_CACHE); - case "taobao" -> new AuthTaobaoRequest(builder.build(), STATE_CACHE); - case "douyin" -> new AuthDouyinRequest(builder.build(), STATE_CACHE); - case "linkedin" -> new AuthLinkedinRequest(builder.build(), STATE_CACHE); - case "microsoft" -> new AuthMicrosoftRequest(builder.build(), STATE_CACHE); - case "renren" -> new AuthRenrenRequest(builder.build(), STATE_CACHE); - case "stack_overflow" -> new AuthStackOverflowRequest(builder.stackOverflowKey("").build(), STATE_CACHE); - case "huawei" -> new AuthHuaweiRequest(builder.build(), STATE_CACHE); - case "wechat_enterprise" -> new AuthWeChatEnterpriseQrcodeRequest(builder.agentId("").build(), STATE_CACHE); - case "gitlab" -> new AuthGitlabRequest(builder.build(), STATE_CACHE); - case "wechat_mp" -> new AuthWeChatMpRequest(builder.build(), STATE_CACHE); - case "aliyun" -> new AuthAliyunRequest(builder.build(), STATE_CACHE); - case "maxkey" -> new AuthMaxKeyRequest(builder.build(), STATE_CACHE); - default -> throw new AuthException("未获取到有效的Auth配置"); - }; - } -} - diff --git a/src/main/java/org/dromara/system/controller/system/SysSocialController.java b/src/main/java/org/dromara/system/controller/system/SysSocialController.java deleted file mode 100644 index b0281cf..0000000 --- a/src/main/java/org/dromara/system/controller/system/SysSocialController.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.dromara.system.controller.system; - -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.domain.R; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.web.core.BaseController; -import org.dromara.system.domain.vo.SysSocialVo; -import org.dromara.system.service.ISysSocialService; -import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -import java.util.List; - -/** - * 社会化关系 - * - * @author thiszhc - * @date 2023-06-16 - */ -@Validated -@RequiredArgsConstructor -@RestController -@RequestMapping("/system/social") -public class SysSocialController extends BaseController { - - private final ISysSocialService socialUserService; - - /** - * 查询社会化关系列表 - */ - @GetMapping("/list") - public R> list() { - return R.ok(socialUserService.queryListByUserId(LoginHelper.getUserId())); - } - -} diff --git a/src/main/java/org/dromara/system/domain/SysSocial.java b/src/main/java/org/dromara/system/domain/SysSocial.java deleted file mode 100644 index 6210036..0000000 --- a/src/main/java/org/dromara/system/domain/SysSocial.java +++ /dev/null @@ -1,136 +0,0 @@ -package org.dromara.system.domain; - -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableName; -import lombok.Data; -import lombok.EqualsAndHashCode; -import org.dromara.common.mybatis.core.domain.BaseEntity; - -import java.io.Serial; - -/** - * 社会化关系对象 sys_social - * - * @author thiszhc - */ -@Data -@EqualsAndHashCode(callSuper = true) -@TableName("sys_social") -public class SysSocial extends BaseEntity { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - @TableId(value = "id") - private Long id; - - /** - * 用户ID - */ - private Long userId; - - /** - * 的唯一ID - */ - private String authId; - - /** - * 用户来源 - */ - private String source; - - /** - * 用户的授权令牌 - */ - private String accessToken; - - /** - * 用户的授权令牌的有效期,部分平台可能没有 - */ - private int expireIn; - - /** - * 刷新令牌,部分平台可能没有 - */ - private String refreshToken; - - /** - * 用户的 open id - */ - private String openId; - - /** - * 授权的第三方账号 - */ - private String userName; - - /** - * 授权的第三方昵称 - */ - private String nickName; - - /** - * 授权的第三方邮箱 - */ - private String email; - - /** - * 授权的第三方头像地址 - */ - private String avatar; - - /** - * 平台的授权信息,部分平台可能没有 - */ - private String accessCode; - - /** - * 用户的 unionid - */ - private String unionId; - - /** - * 授予的权限,部分平台可能没有 - */ - private String scope; - - /** - * 个别平台的授权信息,部分平台可能没有 - */ - private String tokenType; - - /** - * id token,部分平台可能没有 - */ - private String idToken; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macAlgorithm; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macKey; - - /** - * 用户的授权code,部分平台可能没有 - */ - private String code; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthToken; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthTokenSecret; - - -} diff --git a/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java deleted file mode 100644 index 1a85281..0000000 --- a/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java +++ /dev/null @@ -1,142 +0,0 @@ -package org.dromara.system.domain.bo; - -import io.github.linpeilie.annotations.AutoMapper; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; -import org.dromara.common.core.validate.AddGroup; -import org.dromara.common.core.validate.EditGroup; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.system.domain.SysSocial; - -/** - * 社会化关系业务对象 sys_social - * - * @author Lion Li - */ -@Data -@NoArgsConstructor -@EqualsAndHashCode(callSuper = true) -@AutoMapper(target = SysSocial.class, reverseConvertGenerate = false) -public class SysSocialBo extends BaseEntity { - - /** - * 主键 - */ - @NotNull(message = "主键不能为空", groups = { EditGroup.class }) - private Long id; - - /** - * 的唯一ID - */ - @NotBlank(message = "的唯一ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private String authId; - - /** - * 用户来源 - */ - @NotBlank(message = "用户来源不能为空", groups = { AddGroup.class, EditGroup.class }) - private String source; - - /** - * 用户的授权令牌 - */ - @NotBlank(message = "用户的授权令牌不能为空", groups = { AddGroup.class, EditGroup.class }) - private String accessToken; - - /** - * 用户的授权令牌的有效期,部分平台可能没有 - */ - private int expireIn; - - /** - * 刷新令牌,部分平台可能没有 - */ - private String refreshToken; - - /** - * 平台唯一id - */ - private String openId; - - /** - * 用户的 ID - */ - @NotBlank(message = "用户的 ID不能为空", groups = { AddGroup.class, EditGroup.class }) - private Long userId; - - /** - * 平台的授权信息,部分平台可能没有 - */ - private String accessCode; - - /** - * 用户的 unionid - */ - private String unionId; - - /** - * 授予的权限,部分平台可能没有 - */ - private String scope; - - /** - * 授权的第三方账号 - */ - private String userName; - - /** - * 授权的第三方昵称 - */ - private String nickName; - - /** - * 授权的第三方邮箱 - */ - private String email; - - /** - * 授权的第三方头像地址 - */ - private String avatar; - - /** - * 个别平台的授权信息,部分平台可能没有 - */ - private String tokenType; - - /** - * id token,部分平台可能没有 - */ - private String idToken; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macAlgorithm; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macKey; - - /** - * 用户的授权code,部分平台可能没有 - */ - private String code; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthToken; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthTokenSecret; - - - -} diff --git a/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java deleted file mode 100644 index 948dbcc..0000000 --- a/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java +++ /dev/null @@ -1,144 +0,0 @@ -package org.dromara.system.domain.vo; - -import io.github.linpeilie.annotations.AutoMapper; -import lombok.Data; -import org.dromara.system.domain.SysSocial; - -import java.io.Serial; -import java.io.Serializable; -import java.util.Date; - - -/** - * 社会化关系视图对象 sys_social - * - * @author thiszhc - */ -@Data -@AutoMapper(target = SysSocial.class) -public class SysSocialVo implements Serializable { - - @Serial - private static final long serialVersionUID = 1L; - - /** - * 主键 - */ - private Long id; - - /** - * 用户ID - */ - private Long userId; - - /** - * 租户ID - */ - private String tenantId; - - /** - * 的唯一ID - */ - private String authId; - - /** - * 用户来源 - */ - private String source; - - /** - * 用户的授权令牌 - */ - private String accessToken; - - /** - * 用户的授权令牌的有效期,部分平台可能没有 - */ - private int expireIn; - - /** - * 刷新令牌,部分平台可能没有 - */ - private String refreshToken; - - /** - * 用户的 open id - */ - private String openId; - - /** - * 授权的第三方账号 - */ - private String userName; - - /** - * 授权的第三方昵称 - */ - private String nickName; - - /** - * 授权的第三方邮箱 - */ - private String email; - - /** - * 授权的第三方头像地址 - */ - private String avatar; - - - /** - * 平台的授权信息,部分平台可能没有 - */ - private String accessCode; - - /** - * 用户的 unionid - */ - private String unionId; - - /** - * 授予的权限,部分平台可能没有 - */ - private String scope; - - /** - * 个别平台的授权信息,部分平台可能没有 - */ - private String tokenType; - - /** - * id token,部分平台可能没有 - */ - private String idToken; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macAlgorithm; - - /** - * 小米平台用户的附带属性,部分平台可能没有 - */ - private String macKey; - - /** - * 用户的授权code,部分平台可能没有 - */ - private String code; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthToken; - - /** - * Twitter平台用户的附带属性,部分平台可能没有 - */ - private String oauthTokenSecret; - - /** - * 创建时间 - */ - private Date createTime; -} diff --git a/src/main/java/org/dromara/system/mapper/SysSocialMapper.java b/src/main/java/org/dromara/system/mapper/SysSocialMapper.java deleted file mode 100644 index b942061..0000000 --- a/src/main/java/org/dromara/system/mapper/SysSocialMapper.java +++ /dev/null @@ -1,14 +0,0 @@ -package org.dromara.system.mapper; - -import org.dromara.common.mybatis.core.mapper.BaseMapperPlus; -import org.dromara.system.domain.SysSocial; -import org.dromara.system.domain.vo.SysSocialVo; - -/** - * 社会化关系Mapper接口 - * - * @author thiszhc - */ -public interface SysSocialMapper extends BaseMapperPlus { - -} diff --git a/src/main/java/org/dromara/system/service/ISysSocialService.java b/src/main/java/org/dromara/system/service/ISysSocialService.java deleted file mode 100644 index d5702c9..0000000 --- a/src/main/java/org/dromara/system/service/ISysSocialService.java +++ /dev/null @@ -1,55 +0,0 @@ -package org.dromara.system.service; - -import org.dromara.system.domain.bo.SysSocialBo; -import org.dromara.system.domain.vo.SysSocialVo; - -import java.util.List; - -/** - * 社会化关系Service接口 - * - * @author thiszhc - */ -public interface ISysSocialService { - - - /** - * 查询社会化关系 - */ - SysSocialVo queryById(String id); - - /** - * 查询社会化关系列表 - */ - List queryList(); - - /** - * 查询社会化关系列表 - */ - List queryListByUserId(Long userId); - - /** - * 新增授权关系 - */ - Boolean insertByBo(SysSocialBo bo); - - /** - * 更新社会化关系 - */ - Boolean updateByBo(SysSocialBo bo); - - /** - * 删除社会化关系信息 - */ - Boolean deleteWithValidById(Long id); - - - /** - * 根据 authId 查询 SysSocial 表和 SysUser 表,返回 SysSocialAuthResult 映射的对象 - * @param authId 认证ID - * @return SysSocial - */ - List selectByAuthId(String authId); - - -} diff --git a/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java b/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java deleted file mode 100644 index aa86ae1..0000000 --- a/src/main/java/org/dromara/system/service/impl/SysSocialServiceImpl.java +++ /dev/null @@ -1,106 +0,0 @@ -package org.dromara.system.service.impl; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import org.dromara.common.core.utils.MapstructUtils; -import org.dromara.system.domain.SysSocial; -import org.dromara.system.domain.bo.SysSocialBo; -import org.dromara.system.domain.vo.SysSocialVo; -import org.dromara.system.mapper.SysSocialMapper; -import org.dromara.system.service.ISysSocialService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 社会化关系Service业务层处理 - * - * @author thiszhc - * @date 2023-06-12 - */ -@RequiredArgsConstructor -@Service -public class SysSocialServiceImpl implements ISysSocialService { - - private final SysSocialMapper baseMapper; - - - /** - * 查询社会化关系 - */ - @Override - public SysSocialVo queryById(String id) { - return baseMapper.selectVoById(id); - } - - /** - * 授权列表 - */ - @Override - public List queryList() { - return baseMapper.selectVoList(); - } - - @Override - public List queryListByUserId(Long userId) { - return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getUserId, userId)); - } - - - /** - * 新增社会化关系 - */ - @Override - public Boolean insertByBo(SysSocialBo bo) { - SysSocial add = MapstructUtils.convert(bo, SysSocial.class); - validEntityBeforeSave(add); - boolean flag = baseMapper.insert(add) > 0; - if (flag) { - if (add != null) { - bo.setId(add.getId()); - } else { - return false; - } - } - return flag; - } - - /** - * 更新社会化关系 - */ - @Override - public Boolean updateByBo(SysSocialBo bo) { - SysSocial update = MapstructUtils.convert(bo, SysSocial.class); - validEntityBeforeSave(update); - return baseMapper.updateById(update) > 0; - } - - /** - * 保存前的数据校验 - */ - private void validEntityBeforeSave(SysSocial entity) { - //TODO 做一些数据校验,如唯一约束 - } - - - /** - * 删除社会化关系 - */ - @Override - public Boolean deleteWithValidById(Long id) { - return baseMapper.deleteById(id) > 0; - } - - - /** - * 根据 authId 查询用户信息 - * - * @param authId 认证id - * @return 授权信息 - */ - @Override - public List selectByAuthId(String authId) { - return baseMapper.selectVoList(new LambdaQueryWrapper().eq(SysSocial::getAuthId, authId)); - } - -} diff --git a/src/main/java/org/dromara/web/controller/AuthController.java b/src/main/java/org/dromara/web/controller/AuthController.java index dc31955..ca253c5 100644 --- a/src/main/java/org/dromara/web/controller/AuthController.java +++ b/src/main/java/org/dromara/web/controller/AuthController.java @@ -4,35 +4,29 @@ import cn.dev33.satoken.annotation.SaIgnore; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import me.zhyd.oauth.request.AuthRequest; -import me.zhyd.oauth.utils.AuthStateUtils; import org.dromara.common.core.constant.UserConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.RegisterBody; -import org.dromara.common.core.domain.model.SocialLoginBody; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.core.utils.ValidatorUtils; import org.dromara.common.encrypt.annotation.ApiEncrypt; import org.dromara.common.json.utils.JsonUtils; import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.social.config.properties.SocialLoginConfigProperties; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.utils.SocialUtils; import org.dromara.common.websocket.utils.WebSocketUtils; import org.dromara.system.domain.SysClient; import org.dromara.system.service.ISysClientService; import org.dromara.system.service.ISysConfigService; -import org.dromara.system.service.ISysSocialService; import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.SysLoginService; import org.dromara.web.service.SysRegisterService; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.*; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -49,11 +43,9 @@ import java.util.concurrent.TimeUnit; @RequestMapping("/auth") public class AuthController { - private final SocialProperties socialProperties; private final SysLoginService loginService; private final SysRegisterService registerService; private final ISysConfigService configService; - private final ISysSocialService socialUserService; private final ISysClientService clientService; private final ScheduledExecutorService scheduledExecutorService; @@ -90,57 +82,6 @@ public class AuthController { return R.ok(loginVo); } - /** - * 第三方登录请求 - * - * @param source 登录来源 - * @return 结果 - */ - @GetMapping("/binding/{source}") - public R authBinding(@PathVariable("source") String source) { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - return R.fail(source + "平台账号暂不支持"); - } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); - String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); - return R.ok("操作成功", authorizeUrl); - } - - /** - * 第三方登录回调业务处理 绑定授权 - * - * @param loginBody 请求体 - * @return 结果 - */ - @PostMapping("/social/callback") - public R socialCallback(@RequestBody SocialLoginBody loginBody) { - // 获取第三方登录信息 - AuthResponse response = SocialUtils.loginAuth( - loginBody.getSource(), loginBody.getSocialCode(), - loginBody.getSocialState(), socialProperties); - AuthUser authUserData = response.getData(); - // 判断授权响应是否成功 - if (!response.ok()) { - return R.fail(response.getMsg()); - } - loginService.socialRegister(authUserData); - return R.ok(); - } - - - /** - * 取消授权 - * - * @param socialId socialId - */ - @DeleteMapping(value = "/unlock/{socialId}") - public R unlockSocial(@PathVariable Long socialId) { - Boolean rows = socialUserService.deleteWithValidById(socialId); - return rows ? R.ok() : R.fail("取消授权失败"); - } - - /** * 退出登录 */ diff --git a/src/main/java/org/dromara/web/service/SysLoginService.java b/src/main/java/org/dromara/web/service/SysLoginService.java index 3128060..8717da7 100644 --- a/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/src/main/java/org/dromara/web/service/SysLoginService.java @@ -3,11 +3,9 @@ package org.dromara.web.service; import cn.dev33.satoken.exception.NotLoginException; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; -import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthUser; import org.dromara.common.core.constant.Constants; import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.domain.dto.RoleDTO; @@ -23,12 +21,9 @@ import org.dromara.common.mybatis.helper.DataPermissionHelper; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.bo.SysSocialBo; -import org.dromara.system.domain.vo.SysSocialVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysPermissionService; -import org.dromara.system.service.ISysSocialService; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -53,39 +48,9 @@ public class SysLoginService { private Integer lockTime; private final ISysPermissionService permissionService; - private final ISysSocialService sysSocialService; private final SysUserMapper userMapper; - /** - * 绑定第三方用户 - * - * @param authUserData 授权响应实体 - * @return 统一响应实体 - */ - public void socialRegister(AuthUser authUserData) { - String authId = authUserData.getSource() + authUserData.getUuid(); - // 第三方用户信息 - SysSocialBo bo = BeanUtil.toBean(authUserData, SysSocialBo.class); - BeanUtil.copyProperties(authUserData.getToken(), bo); - bo.setUserId(LoginHelper.getUserId()); - bo.setAuthId(authId); - bo.setOpenId(authUserData.getUuid()); - bo.setUserName(authUserData.getUsername()); - bo.setNickName(authUserData.getNickname()); - // 查询是否已经绑定用户 - List list = sysSocialService.selectByAuthId(authId); - if (CollUtil.isEmpty(list)) { - // 没有绑定用户, 新增用户信息 - sysSocialService.insertByBo(bo); - } else { - // 更新用户信息 - bo.setId(list.get(0).getId()); - sysSocialService.updateByBo(bo); - } - } - - /** * 退出登录 */ diff --git a/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java b/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java deleted file mode 100644 index e9aea9d..0000000 --- a/src/main/java/org/dromara/web/service/impl/SocialAuthStrategy.java +++ /dev/null @@ -1,128 +0,0 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.collection.CollUtil; -import cn.hutool.core.map.MapUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.http.HttpUtil; -import cn.hutool.http.Method; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthResponse; -import me.zhyd.oauth.model.AuthUser; -import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.SocialLoginBody; -import org.dromara.common.core.enums.UserStatus; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.json.utils.JsonUtils; -import org.dromara.common.satoken.utils.LoginHelper; -import org.dromara.common.social.config.properties.SocialProperties; -import org.dromara.common.social.utils.SocialUtils; -import org.dromara.system.domain.SysClient; -import org.dromara.system.domain.SysUser; -import org.dromara.system.domain.vo.SysSocialVo; -import org.dromara.system.domain.vo.SysUserVo; -import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.ISysSocialService; -import org.dromara.web.domain.vo.LoginVo; -import org.dromara.web.service.IAuthStrategy; -import org.dromara.web.service.SysLoginService; -import org.springframework.stereotype.Service; - -import java.util.List; -import java.util.Optional; - -/** - * 第三方授权策略 - * - * @author thiszhc is 三三 - */ -@Slf4j -@Service("social" + IAuthStrategy.BASE_NAME) -@RequiredArgsConstructor -public class SocialAuthStrategy implements IAuthStrategy { - - private final SocialProperties socialProperties; - private final ISysSocialService sysSocialService; - private final SysUserMapper userMapper; - private final SysLoginService loginService; - - /** - * 登录-第三方授权登录 - * - * @param body 登录信息 - * @param client 客户端信息 - */ - @Override - public LoginVo login(String body, SysClient client) { - SocialLoginBody loginBody = JsonUtils.parseObject(body, SocialLoginBody.class); - ValidatorUtils.validate(loginBody); - AuthResponse response = SocialUtils.loginAuth( - loginBody.getSource(), loginBody.getSocialCode(), - loginBody.getSocialState(), socialProperties); - if (!response.ok()) { - throw new ServiceException(response.getMsg()); - } - AuthUser authUserData = response.getData(); - if ("GITEE".equals(authUserData.getSource())) { - // 如用户使用 gitee 登录顺手 star 给作者一点支持 拒绝白嫖 - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Vue-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - HttpUtil.createRequest(Method.PUT, "https://gitee.com/api/v5/user/starred/dromara/RuoYi-Cloud-Plus") - .formStr(MapUtil.of("access_token", authUserData.getToken().getAccessToken())) - .executeAsync(); - } - - List list = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); - if (CollUtil.isEmpty(list)) { - throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); - } - Optional opt = list.stream().filter(x -> x.getTenantId().equals(loginBody.getTenantId())).findAny(); - if (opt.isEmpty()) { - throw new ServiceException("对不起,你没有权限登录当前租户!"); - } - SysSocialVo social = opt.get(); - // 查找用户 - SysUserVo user = loadUser(social.getTenantId(), social.getUserId()); - - // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 - LoginUser loginUser = loginService.buildLoginUser(user); - loginUser.setClientKey(client.getClientKey()); - loginUser.setDeviceType(client.getDeviceType()); - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - model.setExtra(LoginHelper.CLIENT_KEY, client.getClientId()); - // 生成token - LoginHelper.login(loginUser, model); - - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - loginVo.setExpireIn(StpUtil.getTokenTimeout()); - loginVo.setClientId(client.getClientId()); - return loginVo; - } - - private SysUserVo loadUser(String tenantId, Long userId) { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .select(SysUser::getUserName, SysUser::getStatus) - .eq(SysUser::getUserId, userId)); - if (ObjectUtil.isNull(user)) { - log.info("登录用户:{} 不存在.", ""); - throw new UserException("user.not.exists", ""); - } else if (UserStatus.DISABLE.getCode().equals(user.getStatus())) { - log.info("登录用户:{} 已被停用.", ""); - throw new UserException("user.blocked", ""); - } - return userMapper.selectUserByUserName(user.getUserName()); - } - -} diff --git a/src/main/resources/mapper/system/SysSocialMapper.xml b/src/main/resources/mapper/system/SysSocialMapper.xml deleted file mode 100644 index baa4b59..0000000 --- a/src/main/resources/mapper/system/SysSocialMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - -