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