优化管理后台的社交登录
This commit is contained in:
parent
441330e455
commit
b37e593ada
@ -3,7 +3,7 @@ package cn.iocoder.yudao.framework.common.enums;
|
|||||||
/**
|
/**
|
||||||
* Web 过滤器顺序的枚举类,保证过滤器按照符合我们的预期
|
* Web 过滤器顺序的枚举类,保证过滤器按照符合我们的预期
|
||||||
*
|
*
|
||||||
* 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 util 包下
|
* 考虑到每个 starter 都需要用到该工具类,所以放到 common 模块下的 enum 包下
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
|
@ -23,8 +23,8 @@ public class PageParam implements Serializable {
|
|||||||
|
|
||||||
@ApiModelProperty(value = "每页条数,最大值为 100", required = true, example = "10")
|
@ApiModelProperty(value = "每页条数,最大值为 100", required = true, example = "10")
|
||||||
@NotNull(message = "每页条数不能为空")
|
@NotNull(message = "每页条数不能为空")
|
||||||
@Min(value = 1, message = "页码最小值为 1")
|
@Min(value = 1, message = "每页条数最小值为 1")
|
||||||
@Max(value = 100, message = "页码最大值为 100")
|
@Max(value = 100, message = "每页条数最大值为 100")
|
||||||
private Integer pageSize = PAGE_SIZE;
|
private Integer pageSize = PAGE_SIZE;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ import static cn.iocoder.yudao.framework.common.exception.enums.GlobalErrorCodeC
|
|||||||
* 满足如下任一条件,则会进行记录:
|
* 满足如下任一条件,则会进行记录:
|
||||||
* 1. 使用 @ApiOperation + 非 @GetMapping
|
* 1. 使用 @ApiOperation + 非 @GetMapping
|
||||||
* 2. 使用 @OperateLog 注解
|
* 2. 使用 @OperateLog 注解
|
||||||
*
|
* <p>
|
||||||
* 但是,如果声明 @OperateLog 注解时,将 enable 属性设置为 false 时,强制不记录。
|
* 但是,如果声明 @OperateLog 注解时,将 enable 属性设置为 false 时,强制不记录。
|
||||||
*
|
*
|
||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
@ -77,7 +77,8 @@ public class OperateLogAspect {
|
|||||||
return around0(joinPoint, operateLog, apiOperation);
|
return around0(joinPoint, operateLog, apiOperation);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Around("!@annotation(io.swagger.annotations.ApiOperation) && @annotation(operateLog)") // 兼容处理,只添加 @OperateLog 注解的情况
|
@Around("!@annotation(io.swagger.annotations.ApiOperation) && @annotation(operateLog)")
|
||||||
|
// 兼容处理,只添加 @OperateLog 注解的情况
|
||||||
public Object around(ProceedingJoinPoint joinPoint,
|
public Object around(ProceedingJoinPoint joinPoint,
|
||||||
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog) throws Throwable {
|
cn.iocoder.yudao.framework.operatelog.core.annotations.OperateLog operateLog) throws Throwable {
|
||||||
return around0(joinPoint, operateLog, null);
|
return around0(joinPoint, operateLog, null);
|
||||||
@ -236,7 +237,6 @@ public class OperateLogAspect {
|
|||||||
}
|
}
|
||||||
operateLogObj.setDuration((int) (System.currentTimeMillis() - startTime.getTime()));
|
operateLogObj.setDuration((int) (System.currentTimeMillis() - startTime.getTime()));
|
||||||
// (正常)处理 resultCode 和 resultMsg 字段
|
// (正常)处理 resultCode 和 resultMsg 字段
|
||||||
if (result != null) {
|
|
||||||
if (result instanceof CommonResult) {
|
if (result instanceof CommonResult) {
|
||||||
CommonResult<?> commonResult = (CommonResult<?>) result;
|
CommonResult<?> commonResult = (CommonResult<?>) result;
|
||||||
operateLogObj.setResultCode(commonResult.getCode());
|
operateLogObj.setResultCode(commonResult.getCode());
|
||||||
@ -244,7 +244,6 @@ public class OperateLogAspect {
|
|||||||
} else {
|
} else {
|
||||||
operateLogObj.setResultCode(SUCCESS.getCode());
|
operateLogObj.setResultCode(SUCCESS.getCode());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
// (异常)处理 resultCode 和 resultMsg 字段
|
// (异常)处理 resultCode 和 resultMsg 字段
|
||||||
if (exception != null) {
|
if (exception != null) {
|
||||||
operateLogObj.setResultCode(INTERNAL_SERVER_ERROR.getCode());
|
operateLogObj.setResultCode(INTERNAL_SERVER_ERROR.getCode());
|
||||||
|
@ -3,7 +3,9 @@ package cn.iocoder.yudao.module.system.api.social.dto;
|
|||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
@ -14,6 +16,8 @@ import javax.validation.constraints.NotNull;
|
|||||||
* @author 芋道源码
|
* @author 芋道源码
|
||||||
*/
|
*/
|
||||||
@Data
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@AllArgsConstructor
|
||||||
public class SocialUserBindReqDTO {
|
public class SocialUserBindReqDTO {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.system.enums.auth;
|
package cn.iocoder.yudao.module.system.enums.oauth2;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* OAuth2.0 客户端的通用枚举
|
* OAuth2.0 客户端的通用枚举
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.system.enums.auth;
|
package cn.iocoder.yudao.module.system.enums.oauth2;
|
||||||
|
|
||||||
import cn.hutool.core.util.ArrayUtil;
|
import cn.hutool.core.util.ArrayUtil;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
@ -141,23 +141,16 @@ public class AuthController {
|
|||||||
@ApiImplicitParam(name = "type", value = "社交类型", required = true, dataTypeClass = Integer.class),
|
@ApiImplicitParam(name = "type", value = "社交类型", required = true, dataTypeClass = Integer.class),
|
||||||
@ApiImplicitParam(name = "redirectUri", value = "回调路径", dataTypeClass = String.class)
|
@ApiImplicitParam(name = "redirectUri", value = "回调路径", dataTypeClass = String.class)
|
||||||
})
|
})
|
||||||
public CommonResult<String> socialAuthRedirect(@RequestParam("type") Integer type,
|
public CommonResult<String> socialLogin(@RequestParam("type") Integer type,
|
||||||
@RequestParam("redirectUri") String redirectUri) {
|
@RequestParam("redirectUri") String redirectUri) {
|
||||||
return CommonResult.success(socialUserService.getAuthorizeUrl(type, redirectUri));
|
return CommonResult.success(socialUserService.getAuthorizeUrl(type, redirectUri));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/social-quick-login")
|
@PostMapping("/social-login")
|
||||||
@ApiOperation("社交快捷登录,使用 code 授权码")
|
@ApiOperation(value = "社交快捷登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
||||||
public CommonResult<AuthLoginRespVO> socialQuickLogin(@RequestBody @Valid AuthSocialQuickLoginReqVO reqVO) {
|
public CommonResult<AuthLoginRespVO> socialQuickLogin(@RequestBody @Valid AuthSocialLoginReqVO reqVO) {
|
||||||
return success(authService.socialQuickLogin(reqVO));
|
return success(authService.socialLogin(reqVO));
|
||||||
}
|
|
||||||
|
|
||||||
@PostMapping("/social-bind-login")
|
|
||||||
@ApiOperation("社交绑定登录,使用 code 授权码 + 账号密码")
|
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AuthLoginRespVO> socialBindLogin(@RequestBody @Valid AuthSocialBindLoginReqVO reqVO) {
|
|
||||||
return success(authService.socialBindLogin(reqVO));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,8 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.auth.vo;
|
package cn.iocoder.yudao.module.system.controller.admin.auth.vo;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -8,10 +11,11 @@ import lombok.Data;
|
|||||||
import lombok.NoArgsConstructor;
|
import lombok.NoArgsConstructor;
|
||||||
import org.hibernate.validator.constraints.Length;
|
import org.hibernate.validator.constraints.Length;
|
||||||
|
|
||||||
|
import javax.validation.constraints.AssertTrue;
|
||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.Pattern;
|
import javax.validation.constraints.Pattern;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 账号密码登录 Request VO")
|
@ApiModel(value = "管理后台 - 账号密码登录 Request VO", description = "如果登录并绑定社交用户,需要传递 social 开头的参数")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@ -29,6 +33,8 @@ public class AuthLoginReqVO {
|
|||||||
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
|
@Length(min = 4, max = 16, message = "密码长度为 4-16 位")
|
||||||
private String password;
|
private String password;
|
||||||
|
|
||||||
|
// ========== 图片验证码相关 ==========
|
||||||
|
|
||||||
@ApiModelProperty(value = "验证码", required = true, example = "1024", notes = "验证码开启时,需要传递")
|
@ApiModelProperty(value = "验证码", required = true, example = "1024", notes = "验证码开启时,需要传递")
|
||||||
@NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class)
|
@NotEmpty(message = "验证码不能为空", groups = CodeEnableGroup.class)
|
||||||
private String code;
|
private String code;
|
||||||
@ -37,9 +43,31 @@ public class AuthLoginReqVO {
|
|||||||
@NotEmpty(message = "唯一标识不能为空", groups = CodeEnableGroup.class)
|
@NotEmpty(message = "唯一标识不能为空", groups = CodeEnableGroup.class)
|
||||||
private String uuid;
|
private String uuid;
|
||||||
|
|
||||||
|
// ========== 绑定社交登录时,需要传递如下参数 ==========
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
||||||
|
@InEnum(SocialTypeEnum.class)
|
||||||
|
private Integer socialType;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "授权码", required = true, example = "1024")
|
||||||
|
private String socialCode;
|
||||||
|
|
||||||
|
@ApiModelProperty(value = "state", required = true, example = "9b2ffbc1-7425-4155-9894-9d5c08541d62")
|
||||||
|
private String socialState;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 开启验证码的 Group
|
* 开启验证码的 Group
|
||||||
*/
|
*/
|
||||||
public interface CodeEnableGroup {}
|
public interface CodeEnableGroup {}
|
||||||
|
|
||||||
|
@AssertTrue(message = "授权码不能为空")
|
||||||
|
public boolean isSocialCodeValid() {
|
||||||
|
return socialType == null || StrUtil.isNotEmpty(socialCode);
|
||||||
|
}
|
||||||
|
|
||||||
|
@AssertTrue(message = "授权 state 不能为空")
|
||||||
|
public boolean isSocialState() {
|
||||||
|
return socialType == null || StrUtil.isNotEmpty(socialState);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.auth.vo;
|
package cn.iocoder.yudao.module.system.controller.admin.auth.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
|
||||||
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
import cn.iocoder.yudao.framework.common.validation.InEnum;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.AllArgsConstructor;
|
import lombok.AllArgsConstructor;
|
||||||
@ -12,12 +12,12 @@ import lombok.NoArgsConstructor;
|
|||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
@ApiModel("管理后台 - 社交快捷登录 Request VO,使用 code 授权码")
|
@ApiModel("管理后台 - 社交绑定登录 Request VO,使用 code 授权码 + 账号密码")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AuthSocialQuickLoginReqVO {
|
public class AuthSocialLoginReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
@ -16,7 +16,7 @@ import cn.iocoder.yudao.module.system.convert.oauth2.OAuth2OpenConvert;
|
|||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ApproveDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ApproveDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
|
||||||
import cn.iocoder.yudao.module.system.enums.auth.OAuth2GrantTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2GrantTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ApproveService;
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ApproveService;
|
||||||
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ClientService;
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ClientService;
|
||||||
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2GrantService;
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2GrantService;
|
||||||
|
@ -66,7 +66,6 @@ public interface AuthConvert {
|
|||||||
}
|
}
|
||||||
|
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialBindLoginReqVO reqVO);
|
SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialBindLoginReqVO reqVO);
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialQuickLoginReqVO reqVO);
|
|
||||||
|
|
||||||
SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO);
|
SmsCodeSendReqDTO convert(AuthSmsSendReqVO reqVO);
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ package cn.iocoder.yudao.module.system.dal.dataobject.oauth2;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
import cn.iocoder.yudao.framework.common.enums.CommonStatusEnum;
|
||||||
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
|
||||||
import cn.iocoder.yudao.module.system.enums.auth.OAuth2GrantTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2GrantTypeEnum;
|
||||||
import com.baomidou.mybatisplus.annotation.KeySequence;
|
import com.baomidou.mybatisplus.annotation.KeySequence;
|
||||||
import com.baomidou.mybatisplus.annotation.TableField;
|
import com.baomidou.mybatisplus.annotation.TableField;
|
||||||
import com.baomidou.mybatisplus.annotation.TableId;
|
import com.baomidou.mybatisplus.annotation.TableId;
|
||||||
|
@ -60,15 +60,7 @@ public interface AdminAuthService {
|
|||||||
* @param reqVO 登录信息
|
* @param reqVO 登录信息
|
||||||
* @return 登录结果
|
* @return 登录结果
|
||||||
*/
|
*/
|
||||||
AuthLoginRespVO socialQuickLogin(@Valid AuthSocialQuickLoginReqVO reqVO);
|
AuthLoginRespVO socialLogin(@Valid AuthSocialLoginReqVO reqVO);
|
||||||
|
|
||||||
/**
|
|
||||||
* 社交绑定登录,使用 code 授权码 + 账号密码
|
|
||||||
*
|
|
||||||
* @param reqVO 登录信息
|
|
||||||
* @return 登录结果
|
|
||||||
*/
|
|
||||||
AuthLoginRespVO socialBindLogin(@Valid AuthSocialBindLoginReqVO reqVO);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 刷新访问令牌
|
* 刷新访问令牌
|
||||||
|
@ -8,13 +8,14 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
|||||||
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
import cn.iocoder.yudao.framework.common.util.validation.ValidationUtils;
|
||||||
import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
|
import cn.iocoder.yudao.module.system.api.logger.dto.LoginLogCreateReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
|
import cn.iocoder.yudao.module.system.api.sms.SmsCodeApi;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
|
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.*;
|
||||||
import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
|
import cn.iocoder.yudao.module.system.convert.auth.AuthConvert;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||||
import cn.iocoder.yudao.module.system.enums.auth.OAuth2ClientConstants;
|
|
||||||
import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.logger.LoginLogTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
|
import cn.iocoder.yudao.module.system.enums.logger.LoginResultEnum;
|
||||||
|
import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2ClientConstants;
|
||||||
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
import cn.iocoder.yudao.module.system.enums.sms.SmsSceneEnum;
|
||||||
import cn.iocoder.yudao.module.system.service.common.CaptchaService;
|
import cn.iocoder.yudao.module.system.service.common.CaptchaService;
|
||||||
import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
|
import cn.iocoder.yudao.module.system.service.logger.LoginLogService;
|
||||||
@ -91,6 +92,12 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
|||||||
// 使用账号密码,进行登录
|
// 使用账号密码,进行登录
|
||||||
AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword());
|
AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword());
|
||||||
|
|
||||||
|
// 如果 socialType 非空,说明需要绑定社交用户
|
||||||
|
if (reqVO.getSocialType() != null) {
|
||||||
|
socialUserService.bindSocialUser(new SocialUserBindReqDTO(user.getId(), getUserType().getValue(),
|
||||||
|
reqVO.getSocialType(), reqVO.getSocialCode(), reqVO.getSocialState()));
|
||||||
|
}
|
||||||
|
|
||||||
// 创建 Token 令牌,记录登录日志
|
// 创建 Token 令牌,记录登录日志
|
||||||
return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
|
return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_USERNAME);
|
||||||
}
|
}
|
||||||
@ -166,7 +173,7 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AuthLoginRespVO socialQuickLogin(AuthSocialQuickLoginReqVO reqVO) {
|
public AuthLoginRespVO socialLogin(AuthSocialLoginReqVO reqVO) {
|
||||||
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
||||||
Long userId = socialUserService.getBindUserId(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
|
Long userId = socialUserService.getBindUserId(UserTypeEnum.ADMIN.getValue(), reqVO.getType(),
|
||||||
reqVO.getCode(), reqVO.getState());
|
reqVO.getCode(), reqVO.getState());
|
||||||
@ -184,18 +191,6 @@ public class AdminAuthServiceImpl implements AdminAuthService {
|
|||||||
return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
|
return createTokenAfterLoginSuccess(user.getId(), user.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public AuthLoginRespVO socialBindLogin(AuthSocialBindLoginReqVO reqVO) {
|
|
||||||
// 使用账号密码,进行登录。
|
|
||||||
AdminUserDO user = authenticate(reqVO.getUsername(), reqVO.getPassword());
|
|
||||||
|
|
||||||
// 绑定社交用户
|
|
||||||
socialUserService.bindSocialUser(AuthConvert.INSTANCE.convert(user.getId(), getUserType().getValue(), reqVO));
|
|
||||||
|
|
||||||
// 创建 Token 令牌,记录登录日志
|
|
||||||
return createTokenAfterLoginSuccess(user.getId(), reqVO.getUsername(), LoginLogTypeEnum.LOGIN_SOCIAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public AuthLoginRespVO refreshToken(String refreshToken) {
|
public AuthLoginRespVO refreshToken(String refreshToken) {
|
||||||
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT);
|
OAuth2AccessTokenDO accessTokenDO = oauth2TokenService.refreshAccessToken(refreshToken, OAuth2ClientConstants.CLIENT_ID_DEFAULT);
|
||||||
|
@ -11,6 +11,7 @@ import cn.iocoder.yudao.framework.sms.core.client.SmsClientFactory;
|
|||||||
import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
|
import cn.iocoder.yudao.framework.sms.core.client.SmsCommonResult;
|
||||||
import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
|
import cn.iocoder.yudao.framework.sms.core.client.dto.SmsReceiveRespDTO;
|
||||||
import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
|
import cn.iocoder.yudao.framework.sms.core.client.dto.SmsSendRespDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsChannelDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.sms.SmsTemplateDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||||
import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage;
|
import cn.iocoder.yudao.module.system.mq.message.sms.SmsSendMessage;
|
||||||
@ -40,7 +41,8 @@ public class SmsSendServiceImpl implements SmsSendService {
|
|||||||
private AdminUserService adminUserService;
|
private AdminUserService adminUserService;
|
||||||
@Resource
|
@Resource
|
||||||
private MemberService memberService;
|
private MemberService memberService;
|
||||||
|
@Resource
|
||||||
|
private SmsChannelService smsChannelService;
|
||||||
@Resource
|
@Resource
|
||||||
private SmsTemplateService smsTemplateService;
|
private SmsTemplateService smsTemplateService;
|
||||||
@Resource
|
@Resource
|
||||||
@ -80,13 +82,18 @@ public class SmsSendServiceImpl implements SmsSendService {
|
|||||||
String templateCode, Map<String, Object> templateParams) {
|
String templateCode, Map<String, Object> templateParams) {
|
||||||
// 校验短信模板是否合法
|
// 校验短信模板是否合法
|
||||||
SmsTemplateDO template = this.checkSmsTemplateValid(templateCode);
|
SmsTemplateDO template = this.checkSmsTemplateValid(templateCode);
|
||||||
|
// 校验短信渠道是否合法
|
||||||
|
SmsChannelDO smsChannel = this.checkSmsChannelValid(template.getChannelId());
|
||||||
|
|
||||||
// 校验手机号码是否存在
|
// 校验手机号码是否存在
|
||||||
mobile = this.checkMobile(mobile);
|
mobile = this.checkMobile(mobile);
|
||||||
// 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志
|
// 构建有序的模板参数。为什么放在这个位置,是提前保证模板参数的正确性,而不是到了插入发送日志
|
||||||
List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams);
|
List<KeyValue<String, Object>> newTemplateParams = this.buildTemplateParams(template, templateParams);
|
||||||
|
|
||||||
// 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
|
// 创建发送日志。如果模板被禁用,则不发送短信,只记录日志
|
||||||
Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus());
|
Boolean isSend = CommonStatusEnum.ENABLE.getStatus().equals(template.getStatus())
|
||||||
|
&& CommonStatusEnum.ENABLE.getStatus().equals(smsChannel.getStatus());
|
||||||
|
;
|
||||||
String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams);
|
String content = smsTemplateService.formatSmsTemplateContent(template.getContent(), templateParams);
|
||||||
Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
|
Long sendLogId = smsLogService.createSmsLog(mobile, userId, userType, isSend, template, content, templateParams);
|
||||||
|
|
||||||
@ -98,6 +105,16 @@ public class SmsSendServiceImpl implements SmsSendService {
|
|||||||
return sendLogId;
|
return sendLogId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@VisibleForTesting
|
||||||
|
public SmsChannelDO checkSmsChannelValid(Long channelId) {
|
||||||
|
// 获得短信模板。考虑到效率,从缓存中获取
|
||||||
|
SmsChannelDO channelDO = smsChannelService.getSmsChannel(channelId);
|
||||||
|
// 短信模板不存在
|
||||||
|
if (channelDO == null) {
|
||||||
|
throw exception(SMS_SEND_TEMPLATE_NOT_EXISTS);
|
||||||
|
}
|
||||||
|
return channelDO;
|
||||||
|
}
|
||||||
|
|
||||||
@VisibleForTesting
|
@VisibleForTesting
|
||||||
public SmsTemplateDO checkSmsTemplateValid(String templateCode) {
|
public SmsTemplateDO checkSmsTemplateValid(String templateCode) {
|
||||||
@ -112,7 +129,7 @@ public class SmsSendServiceImpl implements SmsSendService {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 将参数模板,处理成有序的 KeyValue 数组
|
* 将参数模板,处理成有序的 KeyValue 数组
|
||||||
*
|
* <p>
|
||||||
* 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说腾讯云 https://cloud.tencent.com/document/product/382/39023
|
* 原因是,部分短信平台并不是使用 key 作为参数,而是数组下标,例如说腾讯云 https://cloud.tencent.com/document/product/382/39023
|
||||||
*
|
*
|
||||||
* @param template 短信模板
|
* @param template 短信模板
|
||||||
|
@ -14,7 +14,7 @@ import cn.iocoder.yudao.module.system.controller.admin.oauth2.vo.open.OAuth2Open
|
|||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ApproveDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ApproveDO;
|
||||||
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.oauth2.OAuth2ClientDO;
|
||||||
import cn.iocoder.yudao.module.system.enums.auth.OAuth2GrantTypeEnum;
|
import cn.iocoder.yudao.module.system.enums.oauth2.OAuth2GrantTypeEnum;
|
||||||
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ApproveService;
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ApproveService;
|
||||||
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ClientService;
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2ClientService;
|
||||||
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2GrantService;
|
import cn.iocoder.yudao.module.system.service.oauth2.OAuth2GrantService;
|
||||||
|
Loading…
Reference in New Issue
Block a user