From afbcf4d35f755fe399e65790d57f81408102d985 Mon Sep 17 00:00:00 2001 From: xin <1099200748@qq.com> Date: Tue, 24 Jun 2025 11:28:12 +0800 Subject: [PATCH] 验证码登录 --- oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserPhoneDto.java | 29 ++++++++++++++ oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java | 43 ++++++++++++++++++++- 2 files changed, 70 insertions(+), 2 deletions(-) diff --git a/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java b/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java index 02ed3dd..9a1f84c 100644 --- a/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java +++ b/oying-system/src/main/java/com/oying/modules/security/rest/AuthController.java @@ -11,6 +11,7 @@ import com.oying.modules.security.service.UserDetailsServiceImpl; import com.oying.modules.security.service.WeiXinService; import com.oying.modules.security.service.dto.AuthUserDto; +import com.oying.modules.security.service.dto.AuthUserPhoneDto; import com.oying.modules.security.service.dto.AuthUserWeixinDto; import com.oying.modules.security.service.dto.JwtUserDto; import com.oying.modules.system.domain.DictDetail; @@ -108,13 +109,51 @@ return ResponseEntity.ok(R.success(authInfo)); } + @Log("短信验证码登录") + @ApiOperation("短信验证码登录") + @AnonymousPostMapping(value = "/login/phone") + public ResponseEntity<Object> loginPhone(@Validated @RequestBody AuthUserPhoneDto authUser, HttpServletRequest request) { + // 查询验证码 + String code = redisUtils.get(authUser.getUuid(), String.class); + // 清除验证码 + redisUtils.del(authUser.getUuid()); + if (StringUtils.isBlank(code)) { + throw new BadRequestException("验证码不存在或已过期"); + } + if (StringUtils.isBlank(authUser.getCode()) || !authUser.getCode().equalsIgnoreCase(code)) { + throw new BadRequestException("验证码错误"); + } + // 获取用户信息 + JwtUserDto jwtUser = userDetailsService.loadUserByUsername(authUser.getUsername()); + Authentication authentication = new UsernamePasswordAuthenticationToken(jwtUser, null, jwtUser.getAuthorities()); + SecurityContextHolder.getContext().setAuthentication(authentication); + // 生成令牌 + String token = tokenProvider.createToken(jwtUser); + // 返回 token 与 用户信息 + Map<String, Object> authInfo = new HashMap<String, Object>(2) {{ + put("token", properties.getTokenStartWith() + token); + put("user", jwtUser); + }}; + if (loginProperties.isSingleLogin()) { + // 踢掉之前已经登录的token + onlineUserService.kickOutForUsername(authUser.getUsername()); + } + // 保存在线信息 + onlineUserService.save(jwtUser, token, request); + // 返回登录信息 + return ResponseEntity.ok(R.success(authInfo)); + } + + public static final String OLD = "OLD"; + public static final String NEW = "NEW"; + @Log("微信授权登录") @ApiOperation("微信授权登录") @AnonymousPostMapping(value = "/login/weixin") public ResponseEntity<Object> loginWeixin(@Validated @RequestBody AuthUserWeixinDto authUser, HttpServletRequest request) throws Exception { JSONObject jsonObject; switch (authUser.getCode()) { - case "OLD": + case OLD: jsonObject = weiXinService.code2Session(authUser.getCode()); String openid = jsonObject.getString("openid"); User userDto = userService.findByOpenid(openid); @@ -127,7 +166,7 @@ } authUser.setUsername(userDto.getUsername()); break; - case "NEW": + case NEW: jsonObject = weiXinService.getPhoneNumber(authUser.getCode()); String phone = jsonObject.getJSONObject("phone_info").getString("purePhoneNumber"); User user1 = userService.findByName(phone); diff --git a/oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserPhoneDto.java b/oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserPhoneDto.java new file mode 100644 index 0000000..dbc39ad --- /dev/null +++ b/oying-system/src/main/java/com/oying/modules/security/service/dto/AuthUserPhoneDto.java @@ -0,0 +1,29 @@ +package com.oying.modules.security.service.dto; + +import io.swagger.annotations.ApiModelProperty; +import lombok.Getter; +import lombok.Setter; + +import javax.validation.constraints.NotBlank; + +/** + * @author xin + * @description 验证码登录 + * @date 2025/6/24 10:30 + */ + +@Getter +@Setter +public class AuthUserPhoneDto { + + @NotBlank + @ApiModelProperty(value = "用户名") + private String username; + + @NotBlank + @ApiModelProperty(value = "验证码") + private String code; + + @ApiModelProperty(value = "验证码的key") + private String uuid = ""; +} -- Gitblit v1.9.3