From 4185aafbb9e488e9988cdfde40796a8c5888addb 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: Mon, 26 Jun 2023 00:21:33 +0800 Subject: [PATCH] =?UTF-8?q?update=20=E7=AE=80=E5=8C=96=20=E6=8E=88?= =?UTF-8?q?=E6=9D=83=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../web/controller/AuthController.java | 22 +++++--- .../org/dromara/web/enumd/AuthTypeEnumd.java | 53 ------------------- .../org/dromara/web/factory/AuthFactory.java | 36 ------------- .../dromara/web/service/IAuthStrategy.java | 22 +++++++- .../dromara/web/service/SysLoginService.java | 20 +------ .../web/service/impl/EmailAuthStrategy.java | 4 +- .../service/impl/PasswordAuthStrategy.java | 2 +- .../web/service/impl/SmsAuthStrategy.java | 4 +- .../web/service/impl/XcxAuthStrategy.java | 4 +- .../user/AuthTypeErrorException.java | 19 ------- .../system/service/ISysClientService.java | 6 +++ .../service/impl/SysClientServiceImpl.java | 28 ++++++---- 12 files changed, 66 insertions(+), 154 deletions(-) delete mode 100644 ruoyi-admin/src/main/java/org/dromara/web/enumd/AuthTypeEnumd.java delete mode 100644 ruoyi-admin/src/main/java/org/dromara/web/factory/AuthFactory.java delete mode 100644 ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/AuthTypeErrorException.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 ae39e1a91..79b3c83b9 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 @@ -5,6 +5,7 @@ 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; @@ -14,21 +15,23 @@ 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.utils.MapstructUtils; +import org.dromara.common.core.utils.MessageUtils; import org.dromara.common.core.utils.StreamUtils; import org.dromara.common.core.utils.StringUtils; import org.dromara.common.social.config.properties.SocialLoginConfigProperties; import org.dromara.common.social.config.properties.SocialProperties; import org.dromara.common.social.utils.SocialUtils; import org.dromara.common.tenant.helper.TenantHelper; +import org.dromara.system.domain.SysClient; import org.dromara.system.domain.bo.SysTenantBo; import org.dromara.system.domain.vo.SysTenantVo; -import org.dromara.system.service.ISysSocialService; +import org.dromara.system.service.ISysClientService; import org.dromara.system.service.ISysConfigService; +import org.dromara.system.service.ISysSocialService; import org.dromara.system.service.ISysTenantService; import org.dromara.web.domain.vo.LoginTenantVo; import org.dromara.web.domain.vo.LoginVo; import org.dromara.web.domain.vo.TenantListVo; -import org.dromara.web.factory.AuthFactory; import org.dromara.web.service.IAuthStrategy; import org.dromara.web.service.SysLoginService; import org.dromara.web.service.SysRegisterService; @@ -43,6 +46,7 @@ import java.util.List; * * @author Lion Li */ +@Slf4j @SaIgnore @Validated @RequiredArgsConstructor @@ -56,6 +60,7 @@ public class AuthController { private final ISysConfigService configService; private final ISysTenantService tenantService; private final ISysSocialService socialUserService; + private final ISysClientService clientService; /** @@ -69,15 +74,16 @@ public class AuthController { // 授权类型和客户端id String clientId = loginBody.getClientId(); String grantType = loginBody.getGrantType(); - IAuthStrategy authStrategy = AuthFactory.instance(grantType); - // 校验请求参数 - authStrategy.validate(loginBody); - // 校验授权类型和客户端id - loginService.checkClientType(clientId, grantType); + 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()); // 登录 - return R.ok(authStrategy.login(clientId, loginBody)); + return R.ok(IAuthStrategy.login(loginBody)); } /** diff --git a/ruoyi-admin/src/main/java/org/dromara/web/enumd/AuthTypeEnumd.java b/ruoyi-admin/src/main/java/org/dromara/web/enumd/AuthTypeEnumd.java deleted file mode 100644 index c4f459fde..000000000 --- a/ruoyi-admin/src/main/java/org/dromara/web/enumd/AuthTypeEnumd.java +++ /dev/null @@ -1,53 +0,0 @@ -package org.dromara.web.enumd; - -import lombok.AllArgsConstructor; -import lombok.Getter; -import org.dromara.web.service.impl.EmailAuthStrategy; -import org.dromara.web.service.impl.PasswordAuthStrategy; -import org.dromara.web.service.impl.SmsAuthStrategy; -import org.dromara.web.service.impl.XcxAuthStrategy; - -/** - * 授权类型枚举 - * - * @author Michelle.Chung - */ -@Getter -@AllArgsConstructor -public enum AuthTypeEnumd { - - /** - * 密码认证 - */ - PASSWORD("password", PasswordAuthStrategy.class), - - /** - * 短信认证 - */ - SMS("sms", SmsAuthStrategy.class), - - /** - * 邮件认证 - */ - EMAIL("email", EmailAuthStrategy.class), - - /** - * 小程序认证 - */ - XCX("xcx", XcxAuthStrategy.class) - ; - - private final String type; - - private final Class strategyClass; - - public static Class getStrategyClass(String type) { - for (AuthTypeEnumd clazz : values()) { - if (clazz.getType().equals(type)) { - return clazz.getStrategyClass(); - } - } - return null; - } - -} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/factory/AuthFactory.java b/ruoyi-admin/src/main/java/org/dromara/web/factory/AuthFactory.java deleted file mode 100644 index dcc05b54d..000000000 --- a/ruoyi-admin/src/main/java/org/dromara/web/factory/AuthFactory.java +++ /dev/null @@ -1,36 +0,0 @@ -package org.dromara.web.factory; - -import cn.hutool.core.util.ObjectUtil; -import lombok.extern.slf4j.Slf4j; -import org.dromara.common.core.utils.SpringUtils; -import org.dromara.web.enumd.AuthTypeEnumd; -import org.dromara.web.service.IAuthStrategy; - -import java.util.Map; -import java.util.concurrent.ConcurrentHashMap; - -/** - * 授权 Factory - * - * @author Michelle.Chung - */ -@Slf4j -public class AuthFactory { - - private static final Map AUTH_STRATEGY_MAP = new ConcurrentHashMap<>(); - - /** - * 实例化 - * - * @param authType 认证类型 - */ - public static IAuthStrategy instance(String authType) { - IAuthStrategy authStrategy = AUTH_STRATEGY_MAP.get(authType); - if (ObjectUtil.isNull(authStrategy)) { - authStrategy = (IAuthStrategy) SpringUtils.getBean(AuthTypeEnumd.getStrategyClass(authType)); - AUTH_STRATEGY_MAP.put(authType, authStrategy); - } - return authStrategy; - } - -} diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java index 970a38c8e..771e5984d 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/IAuthStrategy.java @@ -2,6 +2,8 @@ package org.dromara.web.service; import org.dromara.common.core.domain.model.LoginBody; +import org.dromara.common.core.exception.ServiceException; +import org.dromara.common.core.utils.SpringUtils; import org.dromara.web.domain.vo.LoginVo; /** @@ -11,13 +13,31 @@ import org.dromara.web.domain.vo.LoginVo; */ public interface IAuthStrategy { + String BASE_NAME = "AuthStrategy"; + + /** + * 登录 + */ + static LoginVo login(LoginBody loginBody) { + // 授权类型和客户端id + String clientId = loginBody.getClientId(); + String grantType = loginBody.getGrantType(); + String beanName = grantType + BASE_NAME; + if (!SpringUtils.containsBean(beanName)) { + throw new ServiceException("授权类型不正确!"); + } + IAuthStrategy instance = SpringUtils.getBean(beanName); + instance.validate(loginBody); + return instance.login(clientId, loginBody); + } + /** * 参数校验 */ void validate(LoginBody loginBody); /** - * 登录 + * 参数校验 */ LoginVo login(String clientId, LoginBody loginBody); 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 be6e44134..53a938c5b 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 @@ -19,7 +19,6 @@ 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.AuthTypeErrorException; import org.dromara.common.core.exception.user.CaptchaException; import org.dromara.common.core.exception.user.CaptchaExpireException; import org.dromara.common.core.exception.user.UserException; @@ -29,7 +28,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; @@ -37,8 +35,8 @@ import org.dromara.system.domain.vo.SysTenantVo; import org.dromara.system.domain.vo.SysUserVo; import org.dromara.system.mapper.SysClientMapper; import org.dromara.system.mapper.SysUserMapper; -import org.dromara.system.service.ISysSocialService; import org.dromara.system.service.ISysPermissionService; +import org.dromara.system.service.ISysSocialService; import org.dromara.system.service.ISysTenantService; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Value; @@ -279,7 +277,7 @@ public class SysLoginService { /** * 构建登录用户 */ - private LoginUser buildLoginUser(SysUserVo user) { + public LoginUser buildLoginUser(SysUserVo user) { LoginUser loginUser = new LoginUser(); loginUser.setTenantId(user.getTenantId()); loginUser.setUserId(user.getUserId()); @@ -368,18 +366,4 @@ public class SysLoginService { } } - /** - * 认证类型校验 - */ - public void checkClientType(String clientId, String grantType) { - Long count = clientMapper.selectCount( - new LambdaQueryWrapper() - .eq(SysClient::getClientId, clientId) - .like(SysClient::getGrantType, grantType)); - if (count == 0) { - log.info("客户端id:{} 认证类型:{} 不存在.", clientId, grantType); - throw new AuthTypeErrorException(); - } - } - } diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java index e7daeb8e8..be750e8aa 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/EmailAuthStrategy.java @@ -35,7 +35,7 @@ import org.springframework.stereotype.Service; * @author Michelle.Chung */ @Slf4j -@Service +@Service("email" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor public class EmailAuthStrategy implements IAuthStrategy { @@ -53,8 +53,6 @@ public class EmailAuthStrategy implements IAuthStrategy { String email = loginBody.getEmail(); String emailCode = loginBody.getEmailCode(); - // 校验租户 - loginService.checkTenant(tenantId); // 通过邮箱查找用户 SysUserVo user = loadUserByEmail(tenantId, email); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java index 3d9d66099..eefd9dceb 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/PasswordAuthStrategy.java @@ -38,7 +38,7 @@ import org.springframework.stereotype.Service; * @author Michelle.Chung */ @Slf4j -@Service +@Service("password" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor public class PasswordAuthStrategy implements IAuthStrategy { diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java index 3ac1bb183..c1f742571 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/SmsAuthStrategy.java @@ -35,7 +35,7 @@ import org.springframework.stereotype.Service; * @author Michelle.Chung */ @Slf4j -@Service +@Service("sms" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor public class SmsAuthStrategy implements IAuthStrategy { @@ -53,8 +53,6 @@ public class SmsAuthStrategy implements IAuthStrategy { String phonenumber = loginBody.getPhonenumber(); String smsCode = loginBody.getSmsCode(); - // 校验租户 - loginService.checkTenant(tenantId); // 通过手机号查找用户 SysUserVo user = loadUserByPhonenumber(tenantId, phonenumber); diff --git a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java index 79af4652d..984d91fdb 100644 --- a/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java +++ b/ruoyi-admin/src/main/java/org/dromara/web/service/impl/XcxAuthStrategy.java @@ -25,7 +25,7 @@ import org.springframework.stereotype.Service; * @author Michelle.Chung */ @Slf4j -@Service +@Service("xcx" + IAuthStrategy.BASE_NAME) @RequiredArgsConstructor public class XcxAuthStrategy implements IAuthStrategy { @@ -45,8 +45,6 @@ public class XcxAuthStrategy implements IAuthStrategy { String openid = ""; // 框架登录不限制从什么表查询 只要最终构建出 LoginUser 即可 SysUserVo user = loadUserByOpenid(openid); - // 校验租户 - loginService.checkTenant(user.getTenantId()); // 此处可根据登录用户的数据不同 自行创建 loginUser 属性不够用继承扩展就行了 XcxLoginUser loginUser = new XcxLoginUser(); diff --git a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/AuthTypeErrorException.java b/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/AuthTypeErrorException.java deleted file mode 100644 index 9fc110162..000000000 --- a/ruoyi-common/ruoyi-common-core/src/main/java/org/dromara/common/core/exception/user/AuthTypeErrorException.java +++ /dev/null @@ -1,19 +0,0 @@ -package org.dromara.common.core.exception.user; - -import java.io.Serial; - -/** - * 认证权限类型异常类 - * - * @author Michelle.Chung - */ -public class AuthTypeErrorException extends UserException { - - @Serial - private static final long serialVersionUID = 1L; - - public AuthTypeErrorException() { - super("auth.grant.type.error"); - } - -} diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java index ee21c2ec7..db48d4b79 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/ISysClientService.java @@ -1,5 +1,6 @@ package org.dromara.system.service; +import org.dromara.system.domain.SysClient; import org.dromara.system.domain.vo.SysClientVo; import org.dromara.system.domain.bo.SysClientBo; import org.dromara.common.mybatis.core.page.TableDataInfo; @@ -21,6 +22,11 @@ public interface ISysClientService { */ SysClientVo queryById(Long id); + /** + * 查询客户端信息基于客户端id + */ + SysClient queryByClientId(String clientId); + /** * 查询客户端管理列表 */ diff --git a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java index 72cbc0c94..c635675fa 100644 --- a/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java +++ b/ruoyi-modules/ruoyi-system/src/main/java/org/dromara/system/service/impl/SysClientServiceImpl.java @@ -1,26 +1,26 @@ package org.dromara.system.service.impl; import cn.hutool.crypto.SecureUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.baomidou.mybatisplus.core.toolkit.Wrappers; +import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; import org.dromara.common.core.utils.MapstructUtils; import org.dromara.common.core.utils.StringUtils; -import org.dromara.common.mybatis.core.page.TableDataInfo; import org.dromara.common.mybatis.core.page.PageQuery; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.toolkit.Wrappers; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; +import org.dromara.common.mybatis.core.page.TableDataInfo; +import org.dromara.system.domain.SysClient; import org.dromara.system.domain.bo.SysClientBo; import org.dromara.system.domain.vo.SysClientVo; -import org.dromara.system.domain.SysClient; import org.dromara.system.mapper.SysClientMapper; import org.dromara.system.service.ISysClientService; +import org.springframework.stereotype.Service; +import java.util.Collection; import java.util.List; import java.util.Map; -import java.util.Collection; -import java.util.stream.Collectors; /** * 客户端管理Service业务层处理 @@ -28,6 +28,7 @@ import java.util.stream.Collectors; * @author Michelle.Chung * @date 2023-06-18 */ +@Slf4j @RequiredArgsConstructor @Service public class SysClientServiceImpl implements ISysClientService { @@ -44,6 +45,15 @@ public class SysClientServiceImpl implements ISysClientService { return vo; } + + /** + * 查询客户端管理 + */ + @Override + public SysClient queryByClientId(String clientId) { + return baseMapper.selectOne(new LambdaQueryWrapper().eq(SysClient::getClientId, clientId)); + } + /** * 查询客户端管理列表 */