mirror of
https://gitee.com/huangge1199_admin/vue-pro.git
synced 2024-11-22 23:31:52 +08:00
进一步重构社交登陆的实现
This commit is contained in:
parent
7227664f77
commit
c402077961
@ -23,7 +23,7 @@ import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUti
|
|||||||
|
|
||||||
@Api(tags = "用户 APP - 认证")
|
@Api(tags = "用户 APP - 认证")
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/member/")
|
@RequestMapping("/member/auth")
|
||||||
@Validated
|
@Validated
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class AppAuthController {
|
public class AppAuthController {
|
||||||
@ -33,7 +33,6 @@ public class AppAuthController {
|
|||||||
|
|
||||||
@PostMapping("/login")
|
@PostMapping("/login")
|
||||||
@ApiOperation("使用手机 + 密码登录")
|
@ApiOperation("使用手机 + 密码登录")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) {
|
public CommonResult<AppAuthLoginRespVO> login(@RequestBody @Valid AppAuthLoginReqVO reqVO) {
|
||||||
String token = authService.login(reqVO, getClientIP(), getUserAgent());
|
String token = authService.login(reqVO, getClientIP(), getUserAgent());
|
||||||
// 返回结果
|
// 返回结果
|
||||||
@ -42,7 +41,6 @@ public class AppAuthController {
|
|||||||
|
|
||||||
@PostMapping("/sms-login")
|
@PostMapping("/sms-login")
|
||||||
@ApiOperation("使用手机 + 验证码登录")
|
@ApiOperation("使用手机 + 验证码登录")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) {
|
public CommonResult<AppAuthLoginRespVO> smsLogin(@RequestBody @Valid AppAuthSmsLoginReqVO reqVO) {
|
||||||
String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent());
|
String token = authService.smsLogin(reqVO, getClientIP(), getUserAgent());
|
||||||
// 返回结果
|
// 返回结果
|
||||||
@ -51,7 +49,6 @@ public class AppAuthController {
|
|||||||
|
|
||||||
@PostMapping("/send-sms-code")
|
@PostMapping("/send-sms-code")
|
||||||
@ApiOperation(value = "发送手机验证码")
|
@ApiOperation(value = "发送手机验证码")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) {
|
public CommonResult<Boolean> sendSmsCode(@RequestBody @Valid AppAuthSendSmsReqVO reqVO) {
|
||||||
authService.sendSmsCode(getLoginUserId(), reqVO);
|
authService.sendSmsCode(getLoginUserId(), reqVO);
|
||||||
return success(true);
|
return success(true);
|
||||||
@ -60,7 +57,6 @@ public class AppAuthController {
|
|||||||
@PostMapping("/reset-password")
|
@PostMapping("/reset-password")
|
||||||
@ApiOperation(value = "重置密码", notes = "用户忘记密码时使用")
|
@ApiOperation(value = "重置密码", notes = "用户忘记密码时使用")
|
||||||
@PreAuthenticated
|
@PreAuthenticated
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
|
||||||
public CommonResult<Boolean> resetPassword(@RequestBody @Valid AppAuthResetPasswordReqVO reqVO) {
|
public CommonResult<Boolean> resetPassword(@RequestBody @Valid AppAuthResetPasswordReqVO reqVO) {
|
||||||
authService.resetPassword(reqVO);
|
authService.resetPassword(reqVO);
|
||||||
return success(true);
|
return success(true);
|
||||||
@ -87,35 +83,18 @@ public class AppAuthController {
|
|||||||
return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri));
|
return CommonResult.success(authService.getSocialAuthorizeUrl(type, redirectUri));
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/social-login")
|
@PostMapping("/social-quick-login")
|
||||||
@ApiOperation(value = "社交登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户")
|
@ApiOperation(value = "社交快捷登录,使用 code 授权码", notes = "适合未登录的用户,但是社交账号已绑定用户")
|
||||||
public CommonResult<AppAuthLoginRespVO> socialLogin(@RequestBody @Valid AppAuthSocialLoginReqVO reqVO) {
|
public CommonResult<AppAuthLoginRespVO> socialLogin(@RequestBody @Valid AppAuthSocialQuickLoginReqVO reqVO) {
|
||||||
String token = authService.socialLogin(reqVO, getClientIP(), getUserAgent());
|
String token = authService.socialQuickLogin(reqVO, getClientIP(), getUserAgent());
|
||||||
return success(AppAuthLoginRespVO.builder().token(token).build());
|
return success(AppAuthLoginRespVO.builder().token(token).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/social-login2")
|
@PostMapping("/social-bind-login")
|
||||||
@ApiOperation(value = "社交登录,使用 手机号 + 手机验证码", notes = "适合未登录的用户,进行登录 + 绑定")
|
@ApiOperation(value = "社交绑定登录,使用 手机号 + 手机验证码", notes = "适合未登录的用户,进行登录 + 绑定")
|
||||||
@OperateLog(enable = false) // 避免 Post 请求被记录操作日志
|
public CommonResult<AppAuthLoginRespVO> socialLogin2(@RequestBody @Valid AppAuthSocialBindLoginReqVO reqVO) {
|
||||||
public CommonResult<AppAuthLoginRespVO> socialLogin2(@RequestBody @Valid AppAuthSocialLogin2ReqVO reqVO) {
|
String token = authService.socialBindLogin(reqVO, getClientIP(), getUserAgent());
|
||||||
String token = authService.socialLogin2(reqVO, getClientIP(), getUserAgent());
|
|
||||||
return success(AppAuthLoginRespVO.builder().token(token).build());
|
return success(AppAuthLoginRespVO.builder().token(token).build());
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/social-bind")
|
|
||||||
@ApiOperation(value = "社交绑定,使用 code 授权码", notes = "使用在用户已经登录的情况下")
|
|
||||||
@PreAuthenticated
|
|
||||||
public CommonResult<Boolean> socialBind(@RequestBody @Valid AppAuthSocialBindReqVO reqVO) {
|
|
||||||
authService.socialBind(getLoginUserId(), reqVO);
|
|
||||||
return CommonResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@DeleteMapping("/social-unbind")
|
|
||||||
@ApiOperation("取消社交绑定")
|
|
||||||
@PreAuthenticated
|
|
||||||
public CommonResult<Boolean> socialUnbind(@RequestBody AppAuthSocialUnbindReqVO reqVO) {
|
|
||||||
authService.unbindSocialUser(getLoginUserId(), reqVO);
|
|
||||||
return CommonResult.success(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -14,12 +14,12 @@ import javax.validation.constraints.NotEmpty;
|
|||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
import javax.validation.constraints.Pattern;
|
import javax.validation.constraints.Pattern;
|
||||||
|
|
||||||
@ApiModel("用户 APP - 社交登录 Request VO,使用 code 授权码 + 账号密码")
|
@ApiModel("用户 APP - 社交绑定登录 Request VO,使用 code 授权码 + 账号密码")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AppAuthSocialLogin2ReqVO {
|
public class AppAuthSocialBindLoginReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
||||||
@ -45,5 +45,4 @@ public class AppAuthSocialLogin2ReqVO {
|
|||||||
@Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字")
|
@Pattern(regexp = "^[0-9]+$", message = "手机验证码必须都是数字")
|
||||||
private String smsCode;
|
private String smsCode;
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
@ -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("用户 APP - 社交登录 Request VO,使用 code 授权码")
|
@ApiModel("用户 APP - 社交快捷登录 Request VO,使用 code 授权码")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AppAuthSocialLoginReqVO {
|
public class AppAuthSocialQuickLoginReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
@ -0,0 +1,42 @@
|
|||||||
|
package cn.iocoder.yudao.module.member.controller.app.social;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.convert.social.SocialUserConvert;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.SocialUserApi;
|
||||||
|
import io.swagger.annotations.Api;
|
||||||
|
import io.swagger.annotations.ApiOperation;
|
||||||
|
import org.springframework.validation.annotation.Validated;
|
||||||
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import javax.annotation.Resource;
|
||||||
|
import javax.validation.Valid;
|
||||||
|
|
||||||
|
import static cn.iocoder.yudao.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
|
||||||
|
|
||||||
|
@Api(tags = "用户 App - 社交用户")
|
||||||
|
@RestController
|
||||||
|
@RequestMapping("/system/social-user")
|
||||||
|
@Validated
|
||||||
|
public class AppSocialUserController {
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private SocialUserApi socialUserApi;
|
||||||
|
|
||||||
|
@PostMapping("/bind")
|
||||||
|
@ApiOperation("社交绑定,使用 code 授权码")
|
||||||
|
public CommonResult<Boolean> socialBind(@RequestBody @Valid AppSocialUserBindReqVO reqVO) {
|
||||||
|
socialUserApi.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO));
|
||||||
|
return CommonResult.success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@DeleteMapping("/unbind")
|
||||||
|
@ApiOperation("取消社交绑定")
|
||||||
|
public CommonResult<Boolean> socialUnbind(@RequestBody AppSocialUserUnbindReqVO reqVO) {
|
||||||
|
socialUserApi.unbindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.MEMBER.getValue(), reqVO));
|
||||||
|
return CommonResult.success(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.member.controller.app.auth.vo;
|
package cn.iocoder.yudao.module.member.controller.app.social.vo;
|
||||||
|
|
||||||
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;
|
||||||
@ -17,7 +17,7 @@ import javax.validation.constraints.NotNull;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AppAuthSocialBindReqVO {
|
public class AppSocialUserBindReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.member.controller.app.auth.vo;
|
package cn.iocoder.yudao.module.member.controller.app.social.vo;
|
||||||
|
|
||||||
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;
|
||||||
@ -12,20 +12,20 @@ import lombok.NoArgsConstructor;
|
|||||||
import javax.validation.constraints.NotEmpty;
|
import javax.validation.constraints.NotEmpty;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|
||||||
@ApiModel("用户 APP - 取消社交绑定 Request VO,使用 code 授权码")
|
@ApiModel("用户 APP - 取消社交绑定 Request VO")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AppAuthSocialUnbindReqVO {
|
public class AppSocialUserUnbindReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 SysUserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
||||||
@NotNull(message = "社交平台的类型不能为空")
|
@NotNull(message = "社交平台的类型不能为空")
|
||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交的全局编号", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
|
@ApiModelProperty(value = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
|
||||||
@NotEmpty(message = "社交的全局编号不能为空")
|
@NotEmpty(message = "社交用户的 openid 不能为空")
|
||||||
private String unionId;
|
private String openid;
|
||||||
|
|
||||||
}
|
}
|
@ -3,6 +3,7 @@ package cn.iocoder.yudao.module.member.convert.auth;
|
|||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
|
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeSendReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
import cn.iocoder.yudao.module.system.api.sms.dto.code.SmsCodeUseReqDTO;
|
||||||
@ -26,10 +27,9 @@ public interface AuthConvert {
|
|||||||
return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue());
|
return convert0(bean).setUserType(UserTypeEnum.MEMBER.getValue());
|
||||||
}
|
}
|
||||||
|
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialBindReqVO reqVO);
|
SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialBindLoginReqVO reqVO);
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLogin2ReqVO reqVO);
|
SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialQuickLoginReqVO reqVO);
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AppAuthSocialLoginReqVO reqVO);
|
SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO);
|
||||||
SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppAuthSocialUnbindReqVO reqVO);
|
|
||||||
|
|
||||||
SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO);
|
SmsCodeSendReqDTO convert(AppAuthSendSmsReqVO reqVO);
|
||||||
SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp);
|
SmsCodeUseReqDTO convert(AppAuthResetPasswordReqVO reqVO, SmsSceneEnum scene, String usedIp);
|
||||||
|
@ -0,0 +1,19 @@
|
|||||||
|
package cn.iocoder.yudao.module.member.convert.social;
|
||||||
|
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
|
||||||
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
|
||||||
|
import org.mapstruct.Mapper;
|
||||||
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
|
@Mapper
|
||||||
|
public interface SocialUserConvert {
|
||||||
|
|
||||||
|
SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
|
||||||
|
|
||||||
|
SocialUserBindReqDTO convert(Long userId, Integer userType, AppSocialUserBindReqVO reqVO);
|
||||||
|
|
||||||
|
SocialUserUnbindReqDTO convert(Long userId, Integer userType, AppSocialUserUnbindReqVO reqVO);
|
||||||
|
|
||||||
|
}
|
@ -2,6 +2,8 @@ package cn.iocoder.yudao.module.member.service.auth;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
|
import cn.iocoder.yudao.framework.security.core.service.SecurityAuthFrameworkService;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
|
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
|
|
||||||
@ -43,7 +45,7 @@ public interface MemberAuthService extends SecurityAuthFrameworkService {
|
|||||||
* @param userAgent 用户 UA
|
* @param userAgent 用户 UA
|
||||||
* @return 身份令牌,使用 JWT 方式
|
* @return 身份令牌,使用 JWT 方式
|
||||||
*/
|
*/
|
||||||
String socialLogin(@Valid AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent);
|
String socialQuickLogin(@Valid AppAuthSocialQuickLoginReqVO reqVO, String userIp, String userAgent);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 社交登录,使用 手机号 + 手机验证码
|
* 社交登录,使用 手机号 + 手机验证码
|
||||||
@ -53,23 +55,7 @@ public interface MemberAuthService extends SecurityAuthFrameworkService {
|
|||||||
* @param userAgent 用户 UA
|
* @param userAgent 用户 UA
|
||||||
* @return 身份令牌,使用 JWT 方式
|
* @return 身份令牌,使用 JWT 方式
|
||||||
*/
|
*/
|
||||||
String socialLogin2(@Valid AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent);
|
String socialBindLogin(@Valid AppAuthSocialBindLoginReqVO reqVO, String userIp, String userAgent);
|
||||||
|
|
||||||
/**
|
|
||||||
* 社交绑定,使用 code 授权码
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param reqVO 绑定信息
|
|
||||||
*/
|
|
||||||
void socialBind(Long userId, @Valid AppAuthSocialBindReqVO reqVO);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 取消社交绑定
|
|
||||||
*
|
|
||||||
* @param userId 用户编号
|
|
||||||
* @param reqVO 解绑信息
|
|
||||||
*/
|
|
||||||
void unbindSocialUser(Long userId, @Valid AppAuthSocialUnbindReqVO reqVO);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得社交认证 URL
|
* 获得社交认证 URL
|
||||||
|
@ -8,6 +8,8 @@ import cn.iocoder.yudao.framework.common.util.servlet.ServletUtils;
|
|||||||
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
import cn.iocoder.yudao.framework.security.core.LoginUser;
|
||||||
import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken;
|
import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePasswordAuthenticationToken;
|
||||||
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
|
import cn.iocoder.yudao.module.member.controller.app.auth.vo.*;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserBindReqVO;
|
||||||
|
import cn.iocoder.yudao.module.member.controller.app.social.vo.AppSocialUserUnbindReqVO;
|
||||||
import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
|
import cn.iocoder.yudao.module.member.convert.auth.AuthConvert;
|
||||||
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
import cn.iocoder.yudao.module.member.dal.dataobject.user.MemberUserDO;
|
||||||
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
import cn.iocoder.yudao.module.member.dal.mysql.user.MemberUserMapper;
|
||||||
@ -108,7 +110,7 @@ public class MemberAuthServiceImpl implements MemberAuthService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String socialLogin(AppAuthSocialLoginReqVO reqVO, String userIp, String userAgent) {
|
public String socialQuickLogin(AppAuthSocialQuickLoginReqVO reqVO, String userIp, String userAgent) {
|
||||||
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
// 使用 code 授权码,进行登录。然后,获得到绑定的用户编号
|
||||||
Long userId = socialUserApi.getBindUserId(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
|
Long userId = socialUserApi.getBindUserId(UserTypeEnum.MEMBER.getValue(), reqVO.getType(),
|
||||||
reqVO.getCode(), reqVO.getState());
|
reqVO.getCode(), reqVO.getState());
|
||||||
@ -125,25 +127,19 @@ public class MemberAuthServiceImpl implements MemberAuthService {
|
|||||||
// 创建 LoginUser 对象
|
// 创建 LoginUser 对象
|
||||||
LoginUser loginUser = AuthConvert.INSTANCE.convert(user);
|
LoginUser loginUser = AuthConvert.INSTANCE.convert(user);
|
||||||
|
|
||||||
// 绑定社交用户(更新)
|
|
||||||
socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO));
|
|
||||||
|
|
||||||
// 缓存登录用户到 Redis 中,返回 sessionId 编号
|
// 缓存登录用户到 Redis 中,返回 sessionId 编号
|
||||||
return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent);
|
return createUserSessionAfterLoginSuccess(loginUser, LoginLogTypeEnum.LOGIN_SOCIAL, userIp, userAgent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String socialLogin2(AppAuthSocialLogin2ReqVO reqVO, String userIp, String userAgent) {
|
public String socialBindLogin(AppAuthSocialBindLoginReqVO reqVO, String userIp, String userAgent) {
|
||||||
// 校验社交平台的认证信息是否正确
|
|
||||||
socialUserApi.checkSocialUser(reqVO.getType(), reqVO.getCode(), reqVO.getState());
|
|
||||||
|
|
||||||
// 使用手机号、手机验证码登录
|
// 使用手机号、手机验证码登录
|
||||||
AppAuthSmsLoginReqVO loginReqVO = AppAuthSmsLoginReqVO.builder()
|
AppAuthSmsLoginReqVO loginReqVO = AppAuthSmsLoginReqVO.builder()
|
||||||
.mobile(reqVO.getMobile()).code(reqVO.getSmsCode()).build();
|
.mobile(reqVO.getMobile()).code(reqVO.getSmsCode()).build();
|
||||||
String sessionId = this.smsLogin(loginReqVO, userIp, userAgent);
|
String sessionId = this.smsLogin(loginReqVO, userIp, userAgent);
|
||||||
LoginUser loginUser = userSessionApi.getLoginUser(sessionId);
|
LoginUser loginUser = userSessionApi.getLoginUser(sessionId);
|
||||||
|
|
||||||
// 绑定社交用户(新增)
|
// 绑定社交用户
|
||||||
socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO));
|
socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(loginUser.getId(), getUserType().getValue(), reqVO));
|
||||||
return sessionId;
|
return sessionId;
|
||||||
}
|
}
|
||||||
@ -155,17 +151,6 @@ public class MemberAuthServiceImpl implements MemberAuthService {
|
|||||||
return userSessionApi.createUserSession(loginUser, userIp, userAgent);
|
return userSessionApi.createUserSession(loginUser, userIp, userAgent);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void socialBind(Long userId, AppAuthSocialBindReqVO reqVO) {
|
|
||||||
// 绑定社交用户(新增)
|
|
||||||
socialUserApi.bindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void unbindSocialUser(Long userId, AppAuthSocialUnbindReqVO reqVO) {
|
|
||||||
socialUserApi.unbindSocialUser(AuthConvert.INSTANCE.convert(userId, getUserType().getValue(), reqVO));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getSocialAuthorizeUrl(Integer type, String redirectUri) {
|
public String getSocialAuthorizeUrl(Integer type, String redirectUri) {
|
||||||
return socialUserApi.getAuthorizeUrl(type, redirectUri);
|
return socialUserApi.getAuthorizeUrl(type, redirectUri);
|
||||||
|
@ -37,21 +37,10 @@ public interface SocialUserApi {
|
|||||||
*/
|
*/
|
||||||
void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO);
|
void unbindSocialUser(@Valid SocialUserUnbindReqDTO reqDTO);
|
||||||
|
|
||||||
/**
|
|
||||||
* 校验社交用户的认证信息是否正确
|
|
||||||
* 如果校验不通过,则抛出 {@link ServiceException} 业务异常
|
|
||||||
*
|
|
||||||
* @param type 社交平台的类型
|
|
||||||
* @param code 授权码
|
|
||||||
* @param state state
|
|
||||||
*/
|
|
||||||
void checkSocialUser(Integer type, String code, String state);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获得社交用户的绑定用户编号
|
* 获得社交用户的绑定用户编号
|
||||||
* 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号!
|
* 注意,返回的是 MemberUser 或者 AdminUser 的 id 编号!
|
||||||
* 该方法会执行和 {@link #checkSocialUser(Integer, String, String)} 一样的逻辑。
|
* 在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
|
||||||
* 所以在认证信息不正确的情况下,也会抛出 {@link ServiceException} 业务异常
|
|
||||||
*
|
*
|
||||||
* @param userType 用户类型
|
* @param userType 用户类型
|
||||||
* @param type 社交平台的类型
|
* @param type 社交平台的类型
|
||||||
|
@ -36,11 +36,6 @@ public class SocialUserApiImpl implements SocialUserApi {
|
|||||||
reqDTO.getType(), reqDTO.getUnionId());
|
reqDTO.getType(), reqDTO.getUnionId());
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void checkSocialUser(Integer type, String code, String state) {
|
|
||||||
socialUserService.authSocialUser(type, code, state);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Long getBindUserId(Integer userType, Integer type, String code, String state) {
|
public Long getBindUserId(Integer userType, Integer type, String code, String state) {
|
||||||
return socialUserService.getBindUserId(userType, type, code, state);
|
return socialUserService.getBindUserId(userType, type, code, state);
|
||||||
|
@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.controller.admin.socail;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
import cn.iocoder.yudao.framework.common.enums.UserTypeEnum;
|
||||||
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialUnbindReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO;
|
||||||
import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert;
|
import cn.iocoder.yudao.module.system.convert.social.SocialUserConvert;
|
||||||
import cn.iocoder.yudao.module.system.service.social.SocialUserService;
|
import cn.iocoder.yudao.module.system.service.social.SocialUserService;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
@ -27,15 +27,15 @@ public class SocialUserController {
|
|||||||
|
|
||||||
@PostMapping("/bind")
|
@PostMapping("/bind")
|
||||||
@ApiOperation("社交绑定,使用 code 授权码")
|
@ApiOperation("社交绑定,使用 code 授权码")
|
||||||
public CommonResult<Boolean> socialBind(@RequestBody @Valid AuthSocialBindReqVO reqVO) {
|
public CommonResult<Boolean> socialBind(@RequestBody @Valid SocialUserBindReqVO reqVO) {
|
||||||
socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO));
|
socialUserService.bindSocialUser(SocialUserConvert.INSTANCE.convert(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO));
|
||||||
return CommonResult.success(true);
|
return CommonResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@DeleteMapping("/unbind")
|
@DeleteMapping("/unbind")
|
||||||
@ApiOperation("取消社交绑定")
|
@ApiOperation("取消社交绑定")
|
||||||
public CommonResult<Boolean> socialUnbind(@RequestBody AuthSocialUnbindReqVO reqVO) {
|
public CommonResult<Boolean> socialUnbind(@RequestBody SocialUserUnbindReqVO reqVO) {
|
||||||
socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getUnionId());
|
socialUserService.unbindSocialUser(getLoginUserId(), UserTypeEnum.ADMIN.getValue(), reqVO.getType(), reqVO.getOpenid());
|
||||||
return CommonResult.success(true);
|
return CommonResult.success(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth;
|
package cn.iocoder.yudao.module.system.controller.admin.socail.vo;
|
||||||
|
|
||||||
import cn.iocoder.yudao.module.system.enums.social.SocialTypeEnum;
|
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;
|
||||||
@ -17,7 +17,7 @@ import javax.validation.constraints.NotNull;
|
|||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AuthSocialBindReqVO {
|
public class SocialUserBindReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
@ -1,4 +1,4 @@
|
|||||||
package cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth;
|
package cn.iocoder.yudao.module.system.controller.admin.socail.vo;
|
||||||
|
|
||||||
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;
|
||||||
@ -12,20 +12,20 @@ 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")
|
||||||
@Data
|
@Data
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@Builder
|
@Builder
|
||||||
public class AuthSocialUnbindReqVO {
|
public class SocialUserUnbindReqVO {
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
|
@ApiModelProperty(value = "社交平台的类型", required = true, example = "10", notes = "参见 UserSocialTypeEnum 枚举值")
|
||||||
@InEnum(SocialTypeEnum.class)
|
@InEnum(SocialTypeEnum.class)
|
||||||
@NotNull(message = "社交平台的类型不能为空")
|
@NotNull(message = "社交平台的类型不能为空")
|
||||||
private Integer type;
|
private Integer type;
|
||||||
|
|
||||||
@ApiModelProperty(value = "社交的全局编号", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
|
@ApiModelProperty(value = "社交用户的 openid", required = true, example = "IPRmJ0wvBptiPIlGEZiPewGwiEiE")
|
||||||
@NotEmpty(message = "社交的全局编号不能为空")
|
@NotEmpty(message = "社交用户的 openid 不能为空")
|
||||||
private String unionId;
|
private String openid;
|
||||||
|
|
||||||
}
|
}
|
@ -2,8 +2,8 @@ package cn.iocoder.yudao.module.system.convert.social;
|
|||||||
|
|
||||||
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserBindReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
|
import cn.iocoder.yudao.module.system.api.social.dto.SocialUserUnbindReqDTO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserBindReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialUnbindReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.socail.vo.SocialUserUnbindReqVO;
|
||||||
import org.mapstruct.Mapper;
|
import org.mapstruct.Mapper;
|
||||||
import org.mapstruct.factory.Mappers;
|
import org.mapstruct.factory.Mappers;
|
||||||
|
|
||||||
@ -12,8 +12,8 @@ public interface SocialUserConvert {
|
|||||||
|
|
||||||
SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
|
SocialUserConvert INSTANCE = Mappers.getMapper(SocialUserConvert.class);
|
||||||
|
|
||||||
SocialUserBindReqDTO convert(Long userId, Integer userType, AuthSocialBindReqVO reqVO);
|
SocialUserBindReqDTO convert(Long userId, Integer userType, SocialUserBindReqVO reqVO);
|
||||||
|
|
||||||
SocialUserUnbindReqDTO convert(Long userId, Integer userType, AuthSocialUnbindReqVO reqVO);
|
SocialUserUnbindReqDTO convert(Long userId, Integer userType, SocialUserUnbindReqVO reqVO);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -10,7 +10,6 @@ import cn.iocoder.yudao.framework.security.core.authentication.MultiUsernamePass
|
|||||||
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.controller.admin.auth.vo.auth.AuthLoginReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthLoginReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindLoginReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindLoginReqVO;
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialBindReqVO;
|
|
||||||
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialQuickLoginReqVO;
|
import cn.iocoder.yudao.module.system.controller.admin.auth.vo.auth.AuthSocialQuickLoginReqVO;
|
||||||
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.user.AdminUserDO;
|
import cn.iocoder.yudao.module.system.dal.dataobject.user.AdminUserDO;
|
||||||
|
@ -14,13 +14,13 @@ export function socialBind(type, code, state) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 取消社交绑定
|
// 取消社交绑定
|
||||||
export function socialUnbind(type, unionId) {
|
export function socialUnbind(type, openid) {
|
||||||
return request({
|
return request({
|
||||||
url: '/system/social-user/unbind',
|
url: '/system/social-user/unbind',
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
data: {
|
data: {
|
||||||
type,
|
type,
|
||||||
unionId
|
openid
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user