update 简化 授权相关代码

This commit is contained in:
疯狂的狮子Li 2023-06-26 00:21:33 +08:00
parent cb77876786
commit 4185aafbb9
12 changed files with 66 additions and 154 deletions

View File

@ -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));
}
/**

View File

@ -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;
}
}

View File

@ -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;
}
}

View File

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

View File

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

View File

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

View File

@ -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 {

View File

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

View File

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

View File

@ -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");
}
}

View File

@ -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);
/**
* 查询客户端管理列表
*/

View File

@ -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));
}
/**
* 查询客户端管理列表
*/