From 55c8ea70827ef1ee0d9106083ff07b0e9d0a3bf8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 30 Jun 2023 12:38:50 +0800 Subject: [PATCH 1/4] =?UTF-8?q?update=20=E4=BC=98=E5=8C=96=20=E7=94=A8?= =?UTF-8?q?=E6=88=B7=E6=98=B5=E7=A7=B0=E9=9D=9E=E7=A9=BA=E6=A0=A1=E9=AA=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- pom.xml | 23 +++++++++---------- .../dromara/system/domain/bo/SysUserBo.java | 13 ++++------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/pom.xml b/pom.xml index 9629c9a35..e9cf38661 100644 --- a/pom.xml +++ b/pom.xml @@ -272,6 +272,17 @@ ${lock4j.version} + + + tech.powerjob + powerjob-worker-spring-boot-starter + ${powerjob.version} + + + tech.powerjob + powerjob-official-processors + ${powerjob.version} + com.alibaba @@ -330,18 +341,6 @@ ${revision} - - - tech.powerjob - powerjob-worker-spring-boot-starter - ${powerjob.version} - - - tech.powerjob - powerjob-official-processors - ${powerjob.version} - - diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java index 374bfbf96..011254ead 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/domain/bo/SysUserBo.java @@ -1,11 +1,5 @@ package org.dromara.system.domain.bo; -import org.dromara.common.core.constant.UserConstants; -import org.dromara.common.core.xss.Xss; -import org.dromara.common.mybatis.core.domain.BaseEntity; -import org.dromara.common.sensitive.annotation.Sensitive; -import org.dromara.common.sensitive.core.SensitiveStrategy; -import org.dromara.system.domain.SysUser; import io.github.linpeilie.annotations.AutoMapper; import jakarta.validation.constraints.Email; import jakarta.validation.constraints.NotBlank; @@ -13,8 +7,10 @@ import jakarta.validation.constraints.Size; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.NoArgsConstructor; - -import java.util.Date; +import org.dromara.common.core.constant.UserConstants; +import org.dromara.common.core.xss.Xss; +import org.dromara.common.mybatis.core.domain.BaseEntity; +import org.dromara.system.domain.SysUser; /** * 用户信息业务对象 sys_user @@ -50,6 +46,7 @@ public class SysUserBo extends BaseEntity { * 用户昵称 */ @Xss(message = "用户昵称不能包含脚本字符") + @NotBlank(message = "用户昵称不能为空") @Size(min = 0, max = 30, message = "用户昵称长度不能超过{max}个字符") private String nickName; From a7586639abd0701a502cc4f8962db7e2d5b8706a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=96=AF=E7=8B=82=E7=9A=84=E7=8B=AE=E5=AD=90Li?= <15040126243@163.com> Date: Fri, 30 Jun 2023 14:28:10 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix=20=E4=BF=AE=E5=A4=8D=20=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E9=83=A8=E9=97=A8=E4=B8=8B=E6=8B=89=E6=A0=91=E6=9C=AA?= =?UTF-8?q?=E8=BF=87=E6=BB=A4=E6=95=B0=E6=8D=AE=E6=9D=83=E9=99=90=E9=97=AE?= =?UTF-8?q?=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/system/service/ISysDeptService.java | 3 +-- .../org/dromara/system/service/impl/SysDeptServiceImpl.java | 4 ++-- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java index 1d3277995..b20938187 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysDeptService.java @@ -1,7 +1,6 @@ package org.dromara.system.service; import cn.hutool.core.lang.tree.Tree; -import org.dromara.system.domain.SysDept; import org.dromara.system.domain.bo.SysDeptBo; import org.dromara.system.domain.vo.SysDeptVo; @@ -35,7 +34,7 @@ public interface ISysDeptService { * @param depts 部门列表 * @return 下拉树结构列表 */ - List> buildDeptTreeSelect(List depts); + List> buildDeptTreeSelect(List depts); /** * 根据角色ID查询部门树信息 diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java index 36680e392..874f634b8 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysDeptServiceImpl.java @@ -70,7 +70,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { @Override public List> selectDeptTreeList(SysDeptBo bo) { LambdaQueryWrapper lqw = buildQueryWrapper(bo); - List depts = baseMapper.selectList(lqw); + List depts = baseMapper.selectDeptList(lqw); return buildDeptTreeSelect(depts); } @@ -93,7 +93,7 @@ public class SysDeptServiceImpl implements ISysDeptService, DeptService { * @return 下拉树结构列表 */ @Override - public List> buildDeptTreeSelect(List depts) { + public List> buildDeptTreeSelect(List depts) { if (CollUtil.isEmpty(depts)) { return CollUtil.newArrayList(); } From ff1f3bdc1658d3958975868fbef86e9158916d37 Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 02:30:09 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=90=8D=E6=94=B9?= =?UTF-8?q?=E6=88=90=E7=BB=91=E5=AE=9A=EF=BC=8C=E5=92=8C=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=8C=BA=E5=88=86,=E9=80=82=E9=85=8D=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=8E=88=E6=9D=83=EF=BC=8C=E6=94=AF=E6=8C=81=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=A7=9F=E6=88=B7=E5=88=87=E6=8D=A2=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 23 ++++++- .../dromara/web/service/SysLoginService.java | 63 ++++++++++++------- .../common/core/domain/model/LoginBody.java | 5 ++ .../common/social/utils/SocialUtils.java | 4 +- 4 files changed, 70 insertions(+), 25 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 9032d2768..f5e24325a 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,8 +1,10 @@ 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 cn.hutool.core.util.StrUtil; import jakarta.servlet.http.HttpServletRequest; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -115,19 +117,36 @@ public class AuthController { */ @SuppressWarnings("unchecked") @GetMapping("/social-login") - public R socialLogin(String source, AuthCallback callback) { + public R socialLogin(String source, + String loginType, + String tenantId, + String clientId, + String grantType, + AuthCallback callback) { SocialLoginConfigProperties obj = socialProperties.getType().get(source); if (ObjectUtil.isNull(obj)) { return R.fail(source + "平台账号暂不支持"); } + 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")); + } AuthRequest authRequest = SocialUtils.getAuthRequest(source, obj.getClientId(), obj.getClientSecret(), obj.getRedirectUri()); AuthResponse response = authRequest.login(callback); - return loginService.socialLogin(source, response); + //判断loginType是否为login,如果是login则为登录,否则为绑定 + if (StrUtil.equals(loginType, "login")) { + return loginService.socialLogin(tenantId , response); + } else { + return loginService.sociaRegister(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..10e8e371b 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; @@ -66,47 +67,65 @@ public class SysLoginService { private final ISysSocialService sysSocialService; private final SysUserMapper userMapper; + + /** * 社交登录 * - * @param source 登录来源 + * @param tenantId 租户id * @param authUser 授权响应实体 * @return 统一响应实体 */ - public R socialLogin(String source, AuthResponse authUser) { + public R socialLogin(String tenantId, AuthResponse authUser) { // 判断授权响应是否成功 if (!authUser.ok()) { return R.fail("对不起,授权信息验证不通过,请退出重试!"); } AuthUser authUserData = authUser.getData(); SysSocialVo social = sysSocialService.selectByAuthId(authUserData.getSource() + authUserData.getUuid()); + //验证授权表里面的租户id是否包含当前租户id + if (ObjectUtil.isNotNull(social) && StrUtil.isNotBlank(social.getTenantId()) + && !social.getTenantId().contains(tenantId)) { + return R.fail("对不起,你没有权限登录当前租户!"); + } 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); + return R.fail("你还没有绑定第三方账号,绑定后才可以登录!"); } } + + /** + * 绑定第三方用户 + * @param authUser 授权响应实体 + * @return 统一响应实体 + */ + public R sociaRegister(AuthResponse authUser){ + if (!authUser.ok()) { + return R.fail("对不起,授权信息验证不通过,请退出重试!"); + } + // 判断是否已登录 + if (!StpUtil.isLogin()) { + return R.fail("授权失败,登录状态异常!"); + } + AuthUser authUserData = authUser.getData(); + 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); + + return sysSocialService.insertByBo(bo) ? R.ok("绑定成功!"):R.fail("绑定失败!"); + } + /** * 执行登录和记录登录信息操作 * @@ -124,7 +143,7 @@ public class SysLoginService { 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()); + return R.ok( "登录成功", StpUtil.getTokenValue()); } /** 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..d399778c7 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 @@ -103,4 +103,9 @@ public class LoginBody { @NotBlank(message = "{xcx.code.not.blank}", groups = {WechatGroup.class}) private String xcxCode; + /** + * 第三方登录平台 + */ + private String source; + } 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..7aa9ea396 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 @@ -45,13 +45,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" -> From a667c85344e8e9b13a1fa1443ec5b7a9f024137b Mon Sep 17 00:00:00 2001 From: thiszhc <2029364173@qq.com> Date: Sat, 1 Jul 2023 02:31:02 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E5=90=8D=E6=94=B9?= =?UTF-8?q?=E6=88=90=E7=BB=91=E5=AE=9A=EF=BC=8C=E5=92=8C=E7=99=BB=E5=BD=95?= =?UTF-8?q?=E5=8C=BA=E5=88=86,=E9=80=82=E9=85=8D=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E7=AB=AF=E6=8E=88=E6=9D=83=EF=BC=8C=E6=94=AF=E6=8C=81=E9=80=89?= =?UTF-8?q?=E6=8B=A9=E7=A7=9F=E6=88=B7=E5=88=87=E6=8D=A2=E6=8E=88=E6=9D=83?= =?UTF-8?q?=E5=B9=B3=E5=8F=B0=E7=99=BB=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/java/org/dromara/web/controller/AuthController.java | 1 - .../main/java/org/dromara/web/service/SysLoginService.java | 5 ++--- 2 files changed, 2 insertions(+), 4 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 f5e24325a..c45473474 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 cn.hutool.core.util.StrUtil; 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 10e8e371b..e56c267e6 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 @@ -92,7 +92,7 @@ public class SysLoginService { SysUser user = userMapper.selectOne(new LambdaQueryWrapper() .eq(SysUser::getUserId, social.getUserId())); // 执行登录 - return loginAndRecord(user.getTenantId(), user.getUserName(), authUserData); + return loginAndRecord(user.getTenantId(), user.getUserName()); } else { return R.fail("你还没有绑定第三方账号,绑定后才可以登录!"); } @@ -131,10 +131,9 @@ public class SysLoginService { * * @param tenantId 租户ID * @param userName 用户名 - * @param authUser 授权用户信息 * @return 统一响应实体 */ - private R loginAndRecord(String tenantId, String userName, AuthUser authUser) { + private R loginAndRecord(String tenantId, String userName) { checkTenant(tenantId); SysUserVo user = loadUserByUsername(tenantId, userName); SaLoginModel model = new SaLoginModel();