mirror of
https://gitee.com/dromara/RuoYi-Vue-Plus.git
synced 2026-09-20 18:15:56 +08:00
update 简化 授权相关代码
This commit is contained in:
parent
cb77876786
commit
4185aafbb9
@ -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));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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<String, IAuthStrategy> 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;
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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<SysClient>()
|
||||
.eq(SysClient::getClientId, clientId)
|
||||
.like(SysClient::getGrantType, grantType));
|
||||
if (count == 0) {
|
||||
log.info("客户端id:{} 认证类型:{} 不存在.", clientId, grantType);
|
||||
throw new AuthTypeErrorException();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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 {
|
||||
|
||||
|
||||
@ -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);
|
||||
|
||||
|
||||
@ -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();
|
||||
|
||||
@ -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");
|
||||
}
|
||||
|
||||
}
|
||||
@ -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);
|
||||
|
||||
/**
|
||||
* 查询客户端管理列表
|
||||
*/
|
||||
|
||||
@ -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<SysClient>().eq(SysClient::getClientId, clientId));
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询客户端管理列表
|
||||
*/
|
||||
|
||||
Loading…
Reference in New Issue
Block a user