From d61bf7368b0b5eeb5955119bc08a8dff9354e7c9 Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 15:16:31 +0800 Subject: [PATCH 1/6] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E7=99=BB=E5=BD=95?= =?UTF-8?q?=EF=BC=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=AE=E6=94=B9=E5=A4=87?= =?UTF-8?q?=E6=B3=A8=E6=9B=B4=E5=A5=BD=E7=90=86=E8=A7=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 51 +++++--- .../dromara/web/service/SysLoginService.java | 72 +++--------- .../web/service/impl/socialAuthStrategy.java | 109 ++++++++++++++++++ .../common/core/domain/model/LoginBody.java | 22 +++- .../common/core/domain/model/SocialLogin.java | 21 ++++ .../core/validate/auth/SocialGroup.java | 4 + .../common/social/utils/SocialUtils.java | 34 +++++- .../dromara/system/domain/bo/SysSocialBo.java | 4 +- .../dromara/system/domain/vo/SysSocialVo.java | 2 +- script/sql/ry_vue_5.X.sql | 4 +- 10 files changed, 237 insertions(+), 86 deletions(-) create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index 9032d2768..c09bf66ae 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,6 +1,7 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletRequest; @@ -14,6 +15,7 @@ import me.zhyd.oauth.utils.AuthStateUtils; 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.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StreamUtils; @@ -87,7 +89,7 @@ public class AuthController { } /** - * 认证授权 + * 第三方登录请求 * * @param source 登录来源 * @return 结果 @@ -98,36 +100,47 @@ public class AuthController { if (ObjectUtil.isNull(obj)) { return R.fail(source + "平台账号暂不支持"); } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, - obj.getClientId(), - obj.getClientSecret(), - obj.getRedirectUri()); + AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); return R.ok(authorizeUrl); } /** * 第三方登录回调业务处理 - * - * @param source 登录来源 - * @param callback 授权响应实体 + * 绑定授权 + * @param loginBody * @return 结果 */ @SuppressWarnings("unchecked") - @GetMapping("/social-login") - public R socialLogin(String source, AuthCallback callback) { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - return R.fail(source + "平台账号暂不支持"); + @PostMapping("/social-login") + public R socialLogin(@RequestBody LoginBody loginBody) { + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + SysClient client = clientService.queryByClientId(clientId); + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } + // 校验租户 + loginService.checkTenant(loginBody.getTenantId()); + //判断用户登录状态,如果已经登录那么就默认为注册,如果没有登录那么默认登录 + if (!StpUtil.isLogin()) { + return R.ok(IAuthStrategy.login(loginBody, client)); + }else { + // 获取第三方登录信息 + AuthResponse response = SocialUtils.loginAuth(loginBody, socialProperties); + AuthUser authUserData = response.getData(); + // 判断授权响应是否成功 + if (!response.ok()) { + return R.fail(response.getMsg()); + } + return loginService.sociaRegister(authUserData); } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, - obj.getClientId(), - obj.getClientSecret(), - obj.getRedirectUri()); - AuthResponse response = authRequest.login(callback); - return loginService.socialLogin(source, response); } + /** * 取消授权 * diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 88500b22b..dbfae3f60 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -5,6 +5,7 @@ import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -15,7 +16,9 @@ import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.dto.RoleDTO; +import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.LoginUser; +import org.dromara.common.core.domain.model.SocialLogin; import org.dromara.common.core.enums.DeviceType; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.TenantStatus; @@ -27,6 +30,7 @@ import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.exception.TenantException; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysSocialBo; import org.dromara.system.domain.vo.SysSocialVo; @@ -36,6 +40,7 @@ import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysSocialService; import org.dromara.system.service.ISysTenantService; +import org.dromara.web.domain.vo.LoginVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -66,67 +71,26 @@ public class SysLoginService { private final ISysSocialService sysSocialService; private final SysUserMapper userMapper; - /** - * 社交登录 - * - * @param source 登录来源 - * @param authUser 授权响应实体 - * @return 统一响应实体 - */ - public R socialLogin(String source, AuthResponse authUser) { - // 判断授权响应是否成功 - if (!authUser.ok()) { - return R.fail("对不起,授权信息验证不通过,请退出重试!"); - } - AuthUser authUserData = authUser.getData(); - SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); - if (ObjectUtil.isNotNull(social)) { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .eq(SysUser::getUserId, social.getUserId())); - // 执行登录和记录登录信息操作 - return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData); - } else { - // 判断是否已登录 - if (!StpUtil.isLogin()) { - return R.fail("授权失败,请先登录才能绑定"); - } - SysSocialBo bo = new SysSocialBo(); - bo.setUserId(LoginHelper.getUserId()); - bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); - bo.setSource(authUserData.getSource()); - bo.setUserName(authUserData.getUsername()); - bo.setNickName(authUserData.getNickname()); - bo.setAvatar(authUserData.getAvatar()); - bo.setOpenId(authUserData.getUuid()); - BeanUtils.copyProperties(authUserData.getToken(), bo); - sysSocialService.insertByBo(bo); - SysUserVo sysUser = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername()); - // 执行登录和记录登录信息操作 - return loginAndRecord(sysUser.getTenantId(), sysUser.getUserName(), authUserData); - } - } /** - * 执行登录和记录登录信息操作 - * - * @param tenantId 租户ID - * @param userName 用户名 - * @param authUser 授权用户信息 + * 绑定第三方用户 + * @param authUserData 授权响应实体 * @return 统一响应实体 */ - private R loginAndRecord(String tenantId, String userName, AuthUser authUser) { - checkTenant(tenantId); - SysUserVo user = loadUserByUsername(tenantId, userName); - SaLoginModel model = new SaLoginModel(); - model.setDevice(DeviceType.PC.getDevice()); - // 生成token - LoginHelper.login(buildLoginUser(user), model); - recordLogininfor(user.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - recordLoginInfo(user.getUserId()); - return R.ok(StpUtil.getTokenValue()); + public R sociaRegister(AuthUser authUserData ){ + SysSocialBo bo = new SysSocialBo(); + bo.setUserId(LoginHelper.getUserId()); + bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); + bo.setOpenId(authUserData.getUuid()); + bo.setUserName(authUserData.getUsername()); + BeanUtils.copyProperties(authUserData, bo); + BeanUtils.copyProperties(authUserData.getToken(), bo); + sysSocialService.insertByBo(bo); + return R.ok(); } + /** * 退出登录 */ diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java new file mode 100644 index 000000000..c7599eb0c --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java @@ -0,0 +1,109 @@ +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +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.constant.Constants; +import org.dromara.common.core.domain.model.LoginBody; +import org.dromara.common.core.domain.model.SocialLogin; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.auth.SocialGroup; +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.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; + +/** + * 第三方授权策略 + * + * @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; + + + @Override + public void validate(LoginBody loginBody) { + ValidatorUtils.validate(loginBody, SocialGroup.class); + } + + /** + * 登录-第三方授权登录 + * @param clientId 客户端id + * @param loginBody 登录信息 + * @param client 客户端信息 + */ + @Override + public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { + AuthResponse response = SocialUtils.loginAuth(loginBody,socialProperties); + if (!response.ok()) { + throw new ServiceException(response.getMsg()); + } + AuthUser authUserData = response.getData(); + SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (!ObjectUtil.isNotNull(social)) { + throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); + }//验证授权表里面的租户id是否包含当前租户id + if (ObjectUtil.isNotNull(social) && StrUtil.isNotBlank(social.getTenantId()) + && !social.getTenantId().contains(loginBody.getTenantId())) { + throw new ServiceException("对不起,你没有权限登录当前租户!"); + } + return loadinUser(social, client); + } + + /** + * 登录用户信息 + * + * @param social + * @param client + * @return + */ + private LoginVo loadinUser(SysSocialVo social, SysClient client) { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getUserId, social.getUserId())); + SocialLogin loginUser = new SocialLogin(); + loginUser.setUserId(user.getUserId()); + loginUser.setTenantId(user.getTenantId()); + loginUser.setUsername(user.getUserName()); + loginUser.setUserType(user.getUserType()); + // 执行登录 + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + // 生成token + LoginHelper.login(loginUser, model); + + loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + loginService.recordLoginInfo(user.getUserId()); + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + return loginVo; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index 09842a93e..cdff7738b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -3,10 +3,7 @@ package org.dromara.common.core.domain.model; import jakarta.validation.constraints.Email; import org.dromara.common.core.constant.UserConstants; import lombok.Data; -import org.dromara.common.core.validate.auth.EmailGroup; -import org.dromara.common.core.validate.auth.PasswordGroup; -import org.dromara.common.core.validate.auth.SmsGroup; -import org.dromara.common.core.validate.auth.WechatGroup; +import org.dromara.common.core.validate.auth.*; import org.hibernate.validator.constraints.Length; import jakarta.validation.constraints.NotBlank; @@ -103,4 +100,21 @@ public class LoginBody { @NotBlank(message = "{xcx.code.not.blank}", groups = {WechatGroup.class}) private String xcxCode; + /** + * 第三方登录平台 + */ + @NotBlank(message = "{social.source.not.blank}" , groups = {SocialGroup.class}) + private String source; + + /** + * 第三方登录code + */ + @NotBlank(message = "{social.code.not.blank}" , groups = {SocialGroup.class}) + private String socialCode; + + /** + * 第三方登录socialState + */ + @NotBlank(message = "{social.state.not.blank}" , groups = {SocialGroup.class}) + private String socialState; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java new file mode 100644 index 000000000..5666bce56 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java @@ -0,0 +1,21 @@ +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 第三方登录用户身份权限 + * + * @author thiszhc is 三三 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class SocialLogin extends LoginUser{ + + /** + * openid + */ + private String openid; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java new file mode 100644 index 000000000..2b19ffe30 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java @@ -0,0 +1,4 @@ +package org.dromara.common.core.validate.auth; + +public interface SocialGroup { +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index a11520b08..55153302d 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -1,18 +1,42 @@ 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.domain.model.LoginBody; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; /** * 认证授权工具类 * * @author thiszhc */ -public class SocialUtils { +@AutoConfiguration(before = SocialProperties.class) +@EnableConfigurationProperties(SocialProperties.class) +public class SocialUtils { + public static AuthResponse loginAuth(LoginBody loginBody, SocialProperties socialProperties) throws AuthException { + AuthRequest authRequest = getAuthRequest(loginBody.getSource(), socialProperties); + AuthCallback callback = new AuthCallback(); + callback.setCode(loginBody.getSocialCode()); + callback.setState(loginBody.getSocialState()); + return authRequest.login(callback); + } - public static AuthRequest getAuthRequest(String source, String clientId, - String clientSecret, String redirectUri) throws AuthException { + public static AuthRequest getAuthRequest(String source,SocialProperties socialProperties) throws AuthException { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + throw new AuthException("不支持的第三方登录类型"); + } + String clientId = obj.getClientId(); + String clientSecret = obj.getClientSecret(); + String redirectUri = obj.getRedirectUri(); AuthRequest authRequest = null; switch (source.toLowerCase()) { case "dingtalk" -> @@ -45,13 +69,15 @@ public class SocialUtils { case "alipay" -> // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) - .alipayPublicKey("").redirectUri(redirectUri).build()); + .redirectUri(redirectUri).build()); case "qq" -> authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) .redirectUri(redirectUri).build()); case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId) .clientSecret(clientSecret).redirectUri(redirectUri).build()); case "csdn" -> + //注意,经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。 + // so, 本项目中的CSDN登录只能针对少部分用户使用了 authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) .redirectUri(redirectUri).build()); case "taobao" -> diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java index d3b32e00e..7784271bc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -57,9 +57,8 @@ public class SysSocialBo extends TenantEntity { private String refreshToken; /** - * 用户的 open id + * 平台唯一id */ - @NotBlank(message = "用户的 open id不能为空", groups = { AddGroup.class, EditGroup.class }) private String openId; /** @@ -139,4 +138,5 @@ public class SysSocialBo extends TenantEntity { private String oauthTokenSecret; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java index 2a72efe04..8a00cc387 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -73,7 +73,7 @@ public class SysSocialVo implements Serializable { /** * 用户的 open id */ - @ExcelProperty(value = "用户的 open id") + @ExcelProperty(value = "平台的唯一id") private String openId; /** diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index b369b4eaa..1aad1d5a4 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -7,9 +7,9 @@ create table sys_social id bigint not null comment '主键', user_id bigint not null comment '用户ID', tenant_id varchar(20) default null comment '租户id', - auth_id varchar(255) not null comment '授权+授权openid', + auth_id varchar(255) not null comment '平台+平台唯一id', source varchar(255) not null comment '用户来源', - open_id varchar(255) default null comment '原生open id', + open_id varchar(255) default null comment '平台编号唯一id', user_name varchar(30) not null comment '登录账号', nick_name varchar(30) default '' comment '用户昵称', email varchar(255) default '' comment '用户邮箱', From 9d355e85eca3752651a588bbafa6e29b3c197cac Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 15:27:48 +0800 Subject: [PATCH 2/6] =?UTF-8?q?Revert=20"=E7=BB=9F=E4=B8=80=E7=99=BB?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E6=95=B0=E6=8D=AE=E5=BA=93=E4=BF=AE=E6=94=B9?= =?UTF-8?q?=E5=A4=87=E6=B3=A8=E6=9B=B4=E5=A5=BD=E7=90=86=E8=A7=A3"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This reverts commit d61bf7368b0b5eeb5955119bc08a8dff9354e7c9. --- .../web/controller/AuthController.java | 51 +++----- .../dromara/web/service/SysLoginService.java | 74 +++++++++--- .../web/service/impl/socialAuthStrategy.java | 109 ------------------ .../common/core/domain/model/LoginBody.java | 22 +--- .../common/core/domain/model/SocialLogin.java | 21 ---- .../core/validate/auth/SocialGroup.java | 4 - .../common/social/utils/SocialUtils.java | 34 +----- .../dromara/system/domain/bo/SysSocialBo.java | 4 +- .../dromara/system/domain/vo/SysSocialVo.java | 2 +- script/sql/ry_vue_5.X.sql | 4 +- 10 files changed, 87 insertions(+), 238 deletions(-) delete mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java delete mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java delete mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index c09bf66ae..9032d2768 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,7 +1,6 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletRequest; @@ -15,7 +14,6 @@ import me.zhyd.oauth.utils.AuthStateUtils; 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.exception.ServiceException; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StreamUtils; @@ -89,7 +87,7 @@ public class AuthController { } /** - * 第三方登录请求 + * 认证授权 * * @param source 登录来源 * @return 结果 @@ -100,47 +98,36 @@ public class AuthController { if (ObjectUtil.isNull(obj)) { return R.fail(source + "平台账号暂不支持"); } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); + AuthRequest authRequest = SocialUtils.getAuthRequest(source, + obj.getClientId(), + obj.getClientSecret(), + obj.getRedirectUri()); String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); return R.ok(authorizeUrl); } /** * 第三方登录回调业务处理 - * 绑定授权 - * @param loginBody + * + * @param source 登录来源 + * @param callback 授权响应实体 * @return 结果 */ @SuppressWarnings("unchecked") - @PostMapping("/social-login") - public R socialLogin(@RequestBody LoginBody loginBody) { - // 授权类型和客户端id - String clientId = loginBody.getClientId(); - String grantType = loginBody.getGrantType(); - SysClient client = clientService.queryByClientId(clientId); - // 查询不到 client 或 client 内不包含 grantType - if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { - log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); - return R.fail(MessageUtils.message("auth.grant.type.error")); - } - // 校验租户 - loginService.checkTenant(loginBody.getTenantId()); - //判断用户登录状态,如果已经登录那么就默认为注册,如果没有登录那么默认登录 - if (!StpUtil.isLogin()) { - return R.ok(IAuthStrategy.login(loginBody, client)); - }else { - // 获取第三方登录信息 - AuthResponse response = SocialUtils.loginAuth(loginBody, socialProperties); - AuthUser authUserData = response.getData(); - // 判断授权响应是否成功 - if (!response.ok()) { - return R.fail(response.getMsg()); - } - return loginService.sociaRegister(authUserData); + @GetMapping("/social-login") + public R socialLogin(String source, AuthCallback callback) { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + return R.fail(source + "平台账号暂不支持"); } + AuthRequest authRequest = SocialUtils.getAuthRequest(source, + obj.getClientId(), + obj.getClientSecret(), + obj.getRedirectUri()); + AuthResponse response = authRequest.login(callback); + return loginService.socialLogin(source, response); } - /** * 取消授权 * diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index dbfae3f60..88500b22b 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -5,7 +5,6 @@ import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -16,9 +15,7 @@ import org.dromara.common.core.constant.GlobalConstants; import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.dto.RoleDTO; -import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.domain.model.SocialLogin; import org.dromara.common.core.enums.DeviceType; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.TenantStatus; @@ -30,7 +27,6 @@ import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; import org.dromara.common.tenant.exception.TenantException; import org.dromara.common.tenant.helper.TenantHelper; -import org.dromara.system.domain.SysClient; import org.dromara.system.domain.SysUser; import org.dromara.system.domain.bo.SysSocialBo; import org.dromara.system.domain.vo.SysSocialVo; @@ -40,7 +36,6 @@ import org.dromara.system.mapper.SysUserMapper; import org.dromara.system.service.ISysPermissionService; import org.dromara.system.service.ISysSocialService; import org.dromara.system.service.ISysTenantService; -import org.dromara.web.domain.vo.LoginVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -71,25 +66,66 @@ public class SysLoginService { private final ISysSocialService sysSocialService; private final SysUserMapper userMapper; - - /** - * 绑定第三方用户 - * @param authUserData 授权响应实体 + * 社交登录 + * + * @param source 登录来源 + * @param authUser 授权响应实体 * @return 统一响应实体 */ - public R sociaRegister(AuthUser authUserData ){ - SysSocialBo bo = new SysSocialBo(); - bo.setUserId(LoginHelper.getUserId()); - bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); - bo.setOpenId(authUserData.getUuid()); - bo.setUserName(authUserData.getUsername()); - BeanUtils.copyProperties(authUserData, bo); - BeanUtils.copyProperties(authUserData.getToken(), bo); - sysSocialService.insertByBo(bo); - return R.ok(); + public R socialLogin(String source, AuthResponse authUser) { + // 判断授权响应是否成功 + if (!authUser.ok()) { + return R.fail("对不起,授权信息验证不通过,请退出重试!"); + } + AuthUser authUserData = authUser.getData(); + SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (ObjectUtil.isNotNull(social)) { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getUserId, social.getUserId())); + // 执行登录和记录登录信息操作 + return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData); + } else { + // 判断是否已登录 + if (!StpUtil.isLogin()) { + return R.fail("授权失败,请先登录才能绑定"); + } + SysSocialBo bo = new SysSocialBo(); + bo.setUserId(LoginHelper.getUserId()); + bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); + bo.setSource(authUserData.getSource()); + bo.setUserName(authUserData.getUsername()); + bo.setNickName(authUserData.getNickname()); + bo.setAvatar(authUserData.getAvatar()); + bo.setOpenId(authUserData.getUuid()); + BeanUtils.copyProperties(authUserData.getToken(), bo); + + sysSocialService.insertByBo(bo); + SysUserVo sysUser = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername()); + // 执行登录和记录登录信息操作 + return loginAndRecord(sysUser.getTenantId(), sysUser.getUserName(), authUserData); + } } + /** + * 执行登录和记录登录信息操作 + * + * @param tenantId 租户ID + * @param userName 用户名 + * @param authUser 授权用户信息 + * @return 统一响应实体 + */ + private R loginAndRecord(String tenantId, String userName, AuthUser authUser) { + checkTenant(tenantId); + SysUserVo user = loadUserByUsername(tenantId, userName); + SaLoginModel model = new SaLoginModel(); + model.setDevice(DeviceType.PC.getDevice()); + // 生成token + LoginHelper.login(buildLoginUser(user), model); + recordLogininfor(user.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + recordLoginInfo(user.getUserId()); + return R.ok(StpUtil.getTokenValue()); + } /** * 退出登录 diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java deleted file mode 100644 index c7599eb0c..000000000 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java +++ /dev/null @@ -1,109 +0,0 @@ -package org.dromara.web.service.impl; - -import cn.dev33.satoken.stp.SaLoginModel; -import cn.dev33.satoken.stp.StpUtil; -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -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.constant.Constants; -import org.dromara.common.core.domain.model.LoginBody; -import org.dromara.common.core.domain.model.SocialLogin; -import org.dromara.common.core.exception.ServiceException; -import org.dromara.common.core.utils.MessageUtils; -import org.dromara.common.core.utils.ValidatorUtils; -import org.dromara.common.core.validate.auth.SocialGroup; -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.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; - -/** - * 第三方授权策略 - * - * @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; - - - @Override - public void validate(LoginBody loginBody) { - ValidatorUtils.validate(loginBody, SocialGroup.class); - } - - /** - * 登录-第三方授权登录 - * @param clientId 客户端id - * @param loginBody 登录信息 - * @param client 客户端信息 - */ - @Override - public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { - AuthResponse response = SocialUtils.loginAuth(loginBody,socialProperties); - if (!response.ok()) { - throw new ServiceException(response.getMsg()); - } - AuthUser authUserData = response.getData(); - SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); - if (!ObjectUtil.isNotNull(social)) { - throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); - }//验证授权表里面的租户id是否包含当前租户id - if (ObjectUtil.isNotNull(social) && StrUtil.isNotBlank(social.getTenantId()) - && !social.getTenantId().contains(loginBody.getTenantId())) { - throw new ServiceException("对不起,你没有权限登录当前租户!"); - } - return loadinUser(social, client); - } - - /** - * 登录用户信息 - * - * @param social - * @param client - * @return - */ - private LoginVo loadinUser(SysSocialVo social, SysClient client) { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .eq(SysUser::getUserId, social.getUserId())); - SocialLogin loginUser = new SocialLogin(); - loginUser.setUserId(user.getUserId()); - loginUser.setTenantId(user.getTenantId()); - loginUser.setUsername(user.getUserName()); - loginUser.setUserType(user.getUserType()); - // 执行登录 - SaLoginModel model = new SaLoginModel(); - model.setDevice(client.getDeviceType()); - // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 - // 例如: 后台用户30分钟过期 app用户1天过期 - model.setTimeout(client.getTimeout()); - model.setActiveTimeout(client.getActiveTimeout()); - // 生成token - LoginHelper.login(loginUser, model); - - loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - loginService.recordLoginInfo(user.getUserId()); - LoginVo loginVo = new LoginVo(); - loginVo.setAccessToken(StpUtil.getTokenValue()); - return loginVo; - } - -} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index cdff7738b..09842a93e 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -3,7 +3,10 @@ package org.dromara.common.core.domain.model; import jakarta.validation.constraints.Email; import org.dromara.common.core.constant.UserConstants; import lombok.Data; -import org.dromara.common.core.validate.auth.*; +import org.dromara.common.core.validate.auth.EmailGroup; +import org.dromara.common.core.validate.auth.PasswordGroup; +import org.dromara.common.core.validate.auth.SmsGroup; +import org.dromara.common.core.validate.auth.WechatGroup; import org.hibernate.validator.constraints.Length; import jakarta.validation.constraints.NotBlank; @@ -100,21 +103,4 @@ public class LoginBody { @NotBlank(message = "{xcx.code.not.blank}", groups = {WechatGroup.class}) private String xcxCode; - /** - * 第三方登录平台 - */ - @NotBlank(message = "{social.source.not.blank}" , groups = {SocialGroup.class}) - private String source; - - /** - * 第三方登录code - */ - @NotBlank(message = "{social.code.not.blank}" , groups = {SocialGroup.class}) - private String socialCode; - - /** - * 第三方登录socialState - */ - @NotBlank(message = "{social.state.not.blank}" , groups = {SocialGroup.class}) - private String socialState; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java deleted file mode 100644 index 5666bce56..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java +++ /dev/null @@ -1,21 +0,0 @@ -package org.dromara.common.core.domain.model; - -import lombok.Data; -import lombok.EqualsAndHashCode; -import lombok.NoArgsConstructor; - -/** - * 第三方登录用户身份权限 - * - * @author thiszhc is 三三 - */ -@Data -@EqualsAndHashCode(callSuper = true) -@NoArgsConstructor -public class SocialLogin extends LoginUser{ - - /** - * openid - */ - private String openid; -} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java deleted file mode 100644 index 2b19ffe30..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java +++ /dev/null @@ -1,4 +0,0 @@ -package org.dromara.common.core.validate.auth; - -public interface SocialGroup { -} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index 55153302d..a11520b08 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -1,42 +1,18 @@ 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.domain.model.LoginBody; -import org.dromara.common.social.config.properties.SocialLoginConfigProperties; -import org.dromara.common.social.config.properties.SocialProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; /** * 认证授权工具类 * * @author thiszhc */ -@AutoConfiguration(before = SocialProperties.class) -@EnableConfigurationProperties(SocialProperties.class) -public class SocialUtils { - public static AuthResponse loginAuth(LoginBody loginBody, SocialProperties socialProperties) throws AuthException { - AuthRequest authRequest = getAuthRequest(loginBody.getSource(), socialProperties); - AuthCallback callback = new AuthCallback(); - callback.setCode(loginBody.getSocialCode()); - callback.setState(loginBody.getSocialState()); - return authRequest.login(callback); - } +public class SocialUtils { - public static AuthRequest getAuthRequest(String source,SocialProperties socialProperties) throws AuthException { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - throw new AuthException("不支持的第三方登录类型"); - } - String clientId = obj.getClientId(); - String clientSecret = obj.getClientSecret(); - String redirectUri = obj.getRedirectUri(); + public static AuthRequest getAuthRequest(String source, String clientId, + String clientSecret, String redirectUri) throws AuthException { AuthRequest authRequest = null; switch (source.toLowerCase()) { case "dingtalk" -> @@ -69,15 +45,13 @@ public class SocialUtils { case "alipay" -> // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) - .redirectUri(redirectUri).build()); + .alipayPublicKey("").redirectUri(redirectUri).build()); case "qq" -> authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) .redirectUri(redirectUri).build()); case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId) .clientSecret(clientSecret).redirectUri(redirectUri).build()); case "csdn" -> - //注意,经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。 - // so, 本项目中的CSDN登录只能针对少部分用户使用了 authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) .redirectUri(redirectUri).build()); case "taobao" -> diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java index 7784271bc..d3b32e00e 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -57,8 +57,9 @@ public class SysSocialBo extends TenantEntity { private String refreshToken; /** - * 平台唯一id + * 用户的 open id */ + @NotBlank(message = "用户的 open id不能为空", groups = { AddGroup.class, EditGroup.class }) private String openId; /** @@ -138,5 +139,4 @@ public class SysSocialBo extends TenantEntity { private String oauthTokenSecret; - } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java index 8a00cc387..2a72efe04 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -73,7 +73,7 @@ public class SysSocialVo implements Serializable { /** * 用户的 open id */ - @ExcelProperty(value = "平台的唯一id") + @ExcelProperty(value = "用户的 open id") private String openId; /** diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index 1aad1d5a4..b369b4eaa 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -7,9 +7,9 @@ create table sys_social id bigint not null comment '主键', user_id bigint not null comment '用户ID', tenant_id varchar(20) default null comment '租户id', - auth_id varchar(255) not null comment '平台+平台唯一id', + auth_id varchar(255) not null comment '授权+授权openid', source varchar(255) not null comment '用户来源', - open_id varchar(255) default null comment '平台编号唯一id', + open_id varchar(255) default null comment '原生open id', user_name varchar(30) not null comment '登录账号', nick_name varchar(30) default '' comment '用户昵称', email varchar(255) default '' comment '用户邮箱', From d05c641968f104f91db3f8161515c4eaff14111a Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 15:35:07 +0800 Subject: [PATCH 3/6] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E4=BC=98=E5=8C=96=E6=8E=88=E6=9D=83=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 51 ++++---- .../dromara/web/service/SysLoginService.java | 77 +++---------- .../web/service/impl/socialAuthStrategy.java | 109 ++++++++++++++++++ .../common/core/domain/model/LoginBody.java | 22 +++- .../common/core/domain/model/SocialLogin.java | 21 ++++ .../core/validate/auth/SocialGroup.java | 4 + .../common/social/utils/SocialUtils.java | 34 +++++- .../dromara/system/domain/bo/SysSocialBo.java | 4 +- .../dromara/system/domain/vo/SysSocialVo.java | 2 +- script/sql/ry_vue_5.X.sql | 4 +- 10 files changed, 236 insertions(+), 92 deletions(-) create mode 100644 ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java create mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index 9032d2768..ff7c3b1dc 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,12 +1,12 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; +import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import me.zhyd.oauth.model.AuthCallback; import me.zhyd.oauth.model.AuthResponse; import me.zhyd.oauth.model.AuthUser; import me.zhyd.oauth.request.AuthRequest; @@ -87,7 +87,7 @@ public class AuthController { } /** - * 认证授权 + * 第三方登录请求 * * @param source 登录来源 * @return 结果 @@ -98,36 +98,47 @@ public class AuthController { if (ObjectUtil.isNull(obj)) { return R.fail(source + "平台账号暂不支持"); } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, - obj.getClientId(), - obj.getClientSecret(), - obj.getRedirectUri()); + AuthRequest authRequest = SocialUtils.getAuthRequest(source, socialProperties); String authorizeUrl = authRequest.authorize(AuthStateUtils.createState()); return R.ok(authorizeUrl); } /** * 第三方登录回调业务处理 - * - * @param source 登录来源 - * @param callback 授权响应实体 + * 绑定授权 + * @param loginBody * @return 结果 */ @SuppressWarnings("unchecked") - @GetMapping("/social-login") - public R socialLogin(String source, AuthCallback callback) { - SocialLoginConfigProperties obj = socialProperties.getType().get(source); - if (ObjectUtil.isNull(obj)) { - return R.fail(source + "平台账号暂不支持"); + @PostMapping("/social-login") + public R socialLogin(@RequestBody LoginBody loginBody) { + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + SysClient client = clientService.queryByClientId(clientId); + // 查询不到 client 或 client 内不包含 grantType + if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { + log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); + return R.fail(MessageUtils.message("auth.grant.type.error")); + } + // 校验租户 + loginService.checkTenant(loginBody.getTenantId()); + //判断用户登录状态,如果已经登录那么就默认为注册,如果没有登录那么默认登录 + if (!StpUtil.isLogin()) { + return R.ok(IAuthStrategy.login(loginBody, client)); + }else { + // 获取第三方登录信息 + AuthResponse response = SocialUtils.loginAuth(loginBody, socialProperties); + AuthUser authUserData = response.getData(); + // 判断授权响应是否成功 + if (!response.ok()) { + return R.fail(response.getMsg()); + } + return loginService.sociaRegister(authUserData); } - AuthRequest authRequest = SocialUtils.getAuthRequest(source, - obj.getClientId(), - obj.getClientSecret(), - obj.getRedirectUri()); - AuthResponse response = authRequest.login(callback); - return loginService.socialLogin(source, response); } + /** * 取消授权 * diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java index 88500b22b..4da2bb020 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/SysLoginService.java @@ -1,14 +1,12 @@ package org.dromara.web.service; import cn.dev33.satoken.exception.NotLoginException; -import cn.dev33.satoken.stp.SaLoginModel; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.util.ObjectUtil; 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.constant.Constants; import org.dromara.common.core.constant.GlobalConstants; @@ -16,12 +14,14 @@ import org.dromara.common.core.constant.TenantConstants; import org.dromara.common.core.domain.R; import org.dromara.common.core.domain.dto.RoleDTO; import org.dromara.common.core.domain.model.LoginUser; -import org.dromara.common.core.enums.DeviceType; import org.dromara.common.core.enums.LoginType; import org.dromara.common.core.enums.TenantStatus; import org.dromara.common.core.enums.UserStatus; import org.dromara.common.core.exception.user.UserException; -import org.dromara.common.core.utils.*; +import org.dromara.common.core.utils.DateUtils; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ServletUtils; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.common.log.event.LogininforEvent; import org.dromara.common.redis.utils.RedisUtils; import org.dromara.common.satoken.utils.LoginHelper; @@ -29,13 +29,13 @@ import org.dromara.common.tenant.exception.TenantException; import org.dromara.common.tenant.helper.TenantHelper; 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.SysTenantVo; 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.dromara.system.service.ISysTenantService; +import org.dromara.web.domain.vo.LoginVo; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; @@ -66,67 +66,26 @@ public class SysLoginService { private final ISysSocialService sysSocialService; private final SysUserMapper userMapper; - /** - * 社交登录 - * - * @param source 登录来源 - * @param authUser 授权响应实体 - * @return 统一响应实体 - */ - public R socialLogin(String source, AuthResponse authUser) { - // 判断授权响应是否成功 - if (!authUser.ok()) { - return R.fail("对不起,授权信息验证不通过,请退出重试!"); - } - AuthUser authUserData = authUser.getData(); - SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); - if (ObjectUtil.isNotNull(social)) { - SysUser user = userMapper.selectOne(new LambdaQueryWrapper() - .eq(SysUser::getUserId, social.getUserId())); - // 执行登录和记录登录信息操作 - return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData); - } else { - // 判断是否已登录 - if (!StpUtil.isLogin()) { - return R.fail("授权失败,请先登录才能绑定"); - } - SysSocialBo bo = new SysSocialBo(); - bo.setUserId(LoginHelper.getUserId()); - bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); - bo.setSource(authUserData.getSource()); - bo.setUserName(authUserData.getUsername()); - bo.setNickName(authUserData.getNickname()); - bo.setAvatar(authUserData.getAvatar()); - bo.setOpenId(authUserData.getUuid()); - BeanUtils.copyProperties(authUserData.getToken(), bo); - sysSocialService.insertByBo(bo); - SysUserVo sysUser = loadUserByUsername(LoginHelper.getTenantId(), LoginHelper.getUsername()); - // 执行登录和记录登录信息操作 - return loginAndRecord(sysUser.getTenantId(), sysUser.getUserName(), authUserData); - } - } /** - * 执行登录和记录登录信息操作 - * - * @param tenantId 租户ID - * @param userName 用户名 - * @param authUser 授权用户信息 + * 绑定第三方用户 + * @param authUserData 授权响应实体 * @return 统一响应实体 */ - private R loginAndRecord(String tenantId, String userName, AuthUser authUser) { - checkTenant(tenantId); - SysUserVo user = loadUserByUsername(tenantId, userName); - SaLoginModel model = new SaLoginModel(); - model.setDevice(DeviceType.PC.getDevice()); - // 生成token - LoginHelper.login(buildLoginUser(user), model); - recordLogininfor(user.getTenantId(), userName, Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); - recordLoginInfo(user.getUserId()); - return R.ok(StpUtil.getTokenValue()); + public R sociaRegister(AuthUser authUserData ){ + SysSocialBo bo = new SysSocialBo(); + bo.setUserId(LoginHelper.getUserId()); + bo.setAuthId(authUserData.getSource() + authUserData.getUuid()); + bo.setOpenId(authUserData.getUuid()); + bo.setUserName(authUserData.getUsername()); + BeanUtils.copyProperties(authUserData, bo); + BeanUtils.copyProperties(authUserData.getToken(), bo); + sysSocialService.insertByBo(bo); + return R.ok(); } + /** * 退出登录 */ diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java new file mode 100644 index 000000000..c7599eb0c --- /dev/null +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/socialAuthStrategy.java @@ -0,0 +1,109 @@ +package org.dromara.web.service.impl; + +import cn.dev33.satoken.stp.SaLoginModel; +import cn.dev33.satoken.stp.StpUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +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.constant.Constants; +import org.dromara.common.core.domain.model.LoginBody; +import org.dromara.common.core.domain.model.SocialLogin; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.MessageUtils; +import org.dromara.common.core.utils.ValidatorUtils; +import org.dromara.common.core.validate.auth.SocialGroup; +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.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; + +/** + * 第三方授权策略 + * + * @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; + + + @Override + public void validate(LoginBody loginBody) { + ValidatorUtils.validate(loginBody, SocialGroup.class); + } + + /** + * 登录-第三方授权登录 + * @param clientId 客户端id + * @param loginBody 登录信息 + * @param client 客户端信息 + */ + @Override + public LoginVo login(String clientId, LoginBody loginBody, SysClient client) { + AuthResponse response = SocialUtils.loginAuth(loginBody,socialProperties); + if (!response.ok()) { + throw new ServiceException(response.getMsg()); + } + AuthUser authUserData = response.getData(); + SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + if (!ObjectUtil.isNotNull(social)) { + throw new ServiceException("你还没有绑定第三方账号,绑定后才可以登录!"); + }//验证授权表里面的租户id是否包含当前租户id + if (ObjectUtil.isNotNull(social) && StrUtil.isNotBlank(social.getTenantId()) + && !social.getTenantId().contains(loginBody.getTenantId())) { + throw new ServiceException("对不起,你没有权限登录当前租户!"); + } + return loadinUser(social, client); + } + + /** + * 登录用户信息 + * + * @param social + * @param client + * @return + */ + private LoginVo loadinUser(SysSocialVo social, SysClient client) { + SysUser user = userMapper.selectOne(new LambdaQueryWrapper() + .eq(SysUser::getUserId, social.getUserId())); + SocialLogin loginUser = new SocialLogin(); + loginUser.setUserId(user.getUserId()); + loginUser.setTenantId(user.getTenantId()); + loginUser.setUsername(user.getUserName()); + loginUser.setUserType(user.getUserType()); + // 执行登录 + SaLoginModel model = new SaLoginModel(); + model.setDevice(client.getDeviceType()); + // 自定义分配 不同用户体系 不同 token 授权时间 不设置默认走全局 yml 配置 + // 例如: 后台用户30分钟过期 app用户1天过期 + model.setTimeout(client.getTimeout()); + model.setActiveTimeout(client.getActiveTimeout()); + // 生成token + LoginHelper.login(loginUser, model); + + loginService.recordLogininfor(loginUser.getTenantId(), user.getUserName(), Constants.LOGIN_SUCCESS, MessageUtils.message("user.login.success")); + loginService.recordLoginInfo(user.getUserId()); + LoginVo loginVo = new LoginVo(); + loginVo.setAccessToken(StpUtil.getTokenValue()); + return loginVo; + } + +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java index 09842a93e..cdff7738b 100644 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/LoginBody.java @@ -3,10 +3,7 @@ package org.dromara.common.core.domain.model; import jakarta.validation.constraints.Email; import org.dromara.common.core.constant.UserConstants; import lombok.Data; -import org.dromara.common.core.validate.auth.EmailGroup; -import org.dromara.common.core.validate.auth.PasswordGroup; -import org.dromara.common.core.validate.auth.SmsGroup; -import org.dromara.common.core.validate.auth.WechatGroup; +import org.dromara.common.core.validate.auth.*; import org.hibernate.validator.constraints.Length; import jakarta.validation.constraints.NotBlank; @@ -103,4 +100,21 @@ public class LoginBody { @NotBlank(message = "{xcx.code.not.blank}", groups = {WechatGroup.class}) private String xcxCode; + /** + * 第三方登录平台 + */ + @NotBlank(message = "{social.source.not.blank}" , groups = {SocialGroup.class}) + private String source; + + /** + * 第三方登录code + */ + @NotBlank(message = "{social.code.not.blank}" , groups = {SocialGroup.class}) + private String socialCode; + + /** + * 第三方登录socialState + */ + @NotBlank(message = "{social.state.not.blank}" , groups = {SocialGroup.class}) + private String socialState; } diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java new file mode 100644 index 000000000..5666bce56 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/domain/model/SocialLogin.java @@ -0,0 +1,21 @@ +package org.dromara.common.core.domain.model; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import lombok.NoArgsConstructor; + +/** + * 第三方登录用户身份权限 + * + * @author thiszhc is 三三 + */ +@Data +@EqualsAndHashCode(callSuper = true) +@NoArgsConstructor +public class SocialLogin extends LoginUser{ + + /** + * openid + */ + private String openid; +} diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java new file mode 100644 index 000000000..2b19ffe30 --- /dev/null +++ b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/validate/auth/SocialGroup.java @@ -0,0 +1,4 @@ +package org.dromara.common.core.validate.auth; + +public interface SocialGroup { +} diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index a11520b08..55153302d 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -1,18 +1,42 @@ 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.domain.model.LoginBody; +import org.dromara.common.social.config.properties.SocialLoginConfigProperties; +import org.dromara.common.social.config.properties.SocialProperties; +import org.springframework.boot.autoconfigure.AutoConfiguration; +import org.springframework.boot.context.properties.EnableConfigurationProperties; /** * 认证授权工具类 * * @author thiszhc */ -public class SocialUtils { +@AutoConfiguration(before = SocialProperties.class) +@EnableConfigurationProperties(SocialProperties.class) +public class SocialUtils { + public static AuthResponse loginAuth(LoginBody loginBody, SocialProperties socialProperties) throws AuthException { + AuthRequest authRequest = getAuthRequest(loginBody.getSource(), socialProperties); + AuthCallback callback = new AuthCallback(); + callback.setCode(loginBody.getSocialCode()); + callback.setState(loginBody.getSocialState()); + return authRequest.login(callback); + } - public static AuthRequest getAuthRequest(String source, String clientId, - String clientSecret, String redirectUri) throws AuthException { + public static AuthRequest getAuthRequest(String source,SocialProperties socialProperties) throws AuthException { + SocialLoginConfigProperties obj = socialProperties.getType().get(source); + if (ObjectUtil.isNull(obj)) { + throw new AuthException("不支持的第三方登录类型"); + } + String clientId = obj.getClientId(); + String clientSecret = obj.getClientSecret(); + String redirectUri = obj.getRedirectUri(); AuthRequest authRequest = null; switch (source.toLowerCase()) { case "dingtalk" -> @@ -45,13 +69,15 @@ public class SocialUtils { case "alipay" -> // 支付宝在创建回调地址时,不允许使用localhost或者127.0.0.1,所以这儿的回调地址使用的局域网内的ip authRequest = new AuthAlipayRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) - .alipayPublicKey("").redirectUri(redirectUri).build()); + .redirectUri(redirectUri).build()); case "qq" -> authRequest = new AuthQqRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) .redirectUri(redirectUri).build()); case "wechat_open" -> authRequest = new AuthWeChatOpenRequest(AuthConfig.builder().clientId(clientId) .clientSecret(clientSecret).redirectUri(redirectUri).build()); case "csdn" -> + //注意,经咨询CSDN官方客服得知,CSDN的授权开放平台已经下线。如果以前申请过的应用,可以继续使用,但是不再支持申请新的应用。 + // so, 本项目中的CSDN登录只能针对少部分用户使用了 authRequest = new AuthCsdnRequest(AuthConfig.builder().clientId(clientId).clientSecret(clientSecret) .redirectUri(redirectUri).build()); case "taobao" -> diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java index d3b32e00e..7784271bc 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysSocialBo.java @@ -57,9 +57,8 @@ public class SysSocialBo extends TenantEntity { private String refreshToken; /** - * 用户的 open id + * 平台唯一id */ - @NotBlank(message = "用户的 open id不能为空", groups = { AddGroup.class, EditGroup.class }) private String openId; /** @@ -139,4 +138,5 @@ public class SysSocialBo extends TenantEntity { private String oauthTokenSecret; + } diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java index 2a72efe04..8a00cc387 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/vo/SysSocialVo.java @@ -73,7 +73,7 @@ public class SysSocialVo implements Serializable { /** * 用户的 open id */ - @ExcelProperty(value = "用户的 open id") + @ExcelProperty(value = "平台的唯一id") private String openId; /** diff --git a/script/sql/ry_vue_5.X.sql b/script/sql/ry_vue_5.X.sql index b369b4eaa..1aad1d5a4 100644 --- a/script/sql/ry_vue_5.X.sql +++ b/script/sql/ry_vue_5.X.sql @@ -7,9 +7,9 @@ create table sys_social id bigint not null comment '主键', user_id bigint not null comment '用户ID', tenant_id varchar(20) default null comment '租户id', - auth_id varchar(255) not null comment '授权+授权openid', + auth_id varchar(255) not null comment '平台+平台唯一id', source varchar(255) not null comment '用户来源', - open_id varchar(255) default null comment '原生open id', + open_id varchar(255) default null comment '平台编号唯一id', user_name varchar(30) not null comment '登录账号', nick_name varchar(30) default '' comment '用户昵称', email varchar(255) default '' comment '用户邮箱', From 360f6378d6e22854663b9a0a5c929aed95f9f4d5 Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 16:23:28 +0800 Subject: [PATCH 4/6] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E4=BC=98=E5=8C=96=E6=8E=88=E6=9D=83=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dromara/web/controller/AuthController.java | 18 +----------------- 1 file changed, 1 insertion(+), 17 deletions(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index ff7c3b1dc..75f481512 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -110,23 +110,8 @@ public class AuthController { * @return 结果 */ @SuppressWarnings("unchecked") - @PostMapping("/social-login") + @PostMapping("/social/callback") public R socialLogin(@RequestBody LoginBody loginBody) { - // 授权类型和客户端id - String clientId = loginBody.getClientId(); - String grantType = loginBody.getGrantType(); - SysClient client = clientService.queryByClientId(clientId); - // 查询不到 client 或 client 内不包含 grantType - if (ObjectUtil.isNull(client) || !StringUtils.contains(client.getGrantType(), grantType)) { - log.info("客户端id: {} 认证类型:{} 异常!.", clientId, grantType); - return R.fail(MessageUtils.message("auth.grant.type.error")); - } - // 校验租户 - loginService.checkTenant(loginBody.getTenantId()); - //判断用户登录状态,如果已经登录那么就默认为注册,如果没有登录那么默认登录 - if (!StpUtil.isLogin()) { - return R.ok(IAuthStrategy.login(loginBody, client)); - }else { // 获取第三方登录信息 AuthResponse response = SocialUtils.loginAuth(loginBody, socialProperties); AuthUser authUserData = response.getData(); @@ -135,7 +120,6 @@ public class AuthController { return R.fail(response.getMsg()); } return loginService.sociaRegister(authUserData); - } } From 442767fc41e95b6b17fa3edc0a01020fa19f06e9 Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 16:32:58 +0800 Subject: [PATCH 5/6] =?UTF-8?q?=E7=BB=9F=E4=B8=80=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=EF=BC=8C=E4=BC=98=E5=8C=96=E6=8E=88=E6=9D=83=E6=B5=81?= =?UTF-8?q?=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/main/java/org/dromara/web/controller/AuthController.java | 1 - 1 file changed, 1 deletion(-) diff --git a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java index 75f481512..2ed4ed491 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/controller/AuthController.java @@ -1,7 +1,6 @@ package org.dromara.web.controller; import cn.dev33.satoken.annotation.SaIgnore; -import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.util.ObjectUtil; import jakarta.servlet.http.HttpServletRequest; From 04df1365f24c9365867779be19d92e4365e4803f Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 16:46:13 +0800 Subject: [PATCH 6/6] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E9=85=8D=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/dromara/common/social/utils/SocialUtils.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java index 55153302d..f24ea04c1 100644 --- a/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java +++ b/ruoyi-common/ruoyi-common-social/src/main/java/org/dromara/common/social/utils/SocialUtils.java @@ -10,16 +10,12 @@ import me.zhyd.oauth.request.*; import org.dromara.common.core.domain.model.LoginBody; import org.dromara.common.social.config.properties.SocialLoginConfigProperties; import org.dromara.common.social.config.properties.SocialProperties; -import org.springframework.boot.autoconfigure.AutoConfiguration; -import org.springframework.boot.context.properties.EnableConfigurationProperties; /** * 认证授权工具类 * * @author thiszhc */ -@AutoConfiguration(before = SocialProperties.class) -@EnableConfigurationProperties(SocialProperties.class) public class SocialUtils { public static AuthResponse loginAuth(LoginBody loginBody, SocialProperties socialProperties) throws AuthException { AuthRequest authRequest = getAuthRequest(loginBody.getSource(), socialProperties);