spring boot3登录开发-3(2短信验证登录/注册逻辑实现)

这篇具有很好参考价值的文章主要介绍了spring boot3登录开发-3(2短信验证登录/注册逻辑实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

 spring boot3登录开发-3(2短信验证登录/注册逻辑实现),spring boot实战,spring boot,java,redis

⛰️个人主页:     蒾酒

🔥系列专栏:《spring boot实战》

🌊山高路远,行路漫漫,终有归途


目录

写在前面

上文衔接

内容简介

功能分析

短信验证登录实现

1.创建交互对象

用户短信登录/注册DTO

创建用户登录VO

2.创建自定义业务异常

创建验证码错误异常

创建用户被封禁异常

 创建用户注册失败异常

3.登录注册业务逻辑实现

4.测试接口

调用短信验证码发送接口

调用短信验证登录接口

写在最后


写在前面

本文介绍了springboot开发后端服务中,短信验证码登录功能的设计与实现,坚持看完相信对你有帮助。

同时欢迎订阅springboot系列专栏,持续分享spring boot的使用经验。

上文衔接

本文衔接上文,可以看一下:

spring boot3登录开发-2(2短信验证码接口实现)-CSDN博客https://blog.csdn.net/qq_62262918/article/details/136888851?spm=1001.2014.3001.5501

用户表设计如下:

create table user
(
    id           bigint auto_increment comment '主键'
        primary key,
    user_name    varchar(32)                            null comment '用户昵称',
    password     varchar(256)                           null comment '密码',
    user_account varchar(64)                            null comment '账号',
    user_role    varchar(256) default 'user'            null comment '用户角色:user / admin',
    avatar       varchar(1024)                          null comment '头像',
    create_time  datetime     default (now())           null comment '创建时间',
    update_time  datetime     default CURRENT_TIMESTAMP null comment '更新时间',
    is_delete    tinyint(1)   default 0                 null comment '逻辑删除:1删除/0存在',
    gender       tinyint(1)                             null comment '性别',
    status       tinyint(1)   default 1                 not null comment '状态:1正常0禁用',
    phone        varchar(11)                            null comment '手机号'
)
    comment '用户表';

内容简介

上文我们已经实现了短信验证码的发送接口,本文我们来实现这个短信验证登录/注册逻辑。

功能分析

  • 手机号是新手机号则先注册,注册完执行登录
  • 已经注册过的手机号,直接执行登录

短信验证登录实现

1.创建交互对象

用户短信登录/注册DTO

import jakarta.validation.constraints.NotBlank;
import jakarta.validation.constraints.Pattern;
import lombok.Data;

/**
 * @author mijiupro
 */
@Data
public class UserSmsLoginDTO {

    @NotBlank( message = "手机号不能为空")
    @Pattern(regexp = "^1[3456789]\\d{9}$", message = "手机号格式不正确")
    private String phone;//手机号

    @NotBlank( message = "验证码不能为空")
    private String captcha;//验证码
}

创建用户登录VO

import lombok.Builder;
import lombok.Data;
 
import java.io.Serializable;
 
 
/**
 * @author mijiupro
 */
@Data
@Builder
public class UserLoginVO implements Serializable {
    private String token;//令牌
    private String userName;//用户名
    private String avatar;//头像
}

2.创建自定义业务异常

说白了就是登录代码可能会判断账号是否存在,密码是否正确,当账号不存在或密码错误需要返回对应提示信息,这种类似情况多了你的代码就会很多if-return,代码就会很难看;那么通过自定义异常去到异常处理的方法里面写对应返回提示以及其他逻辑,这样直接抛出对应异常AOP拦截到该异常走对应异常处理逻辑即可。(一句话概括就是:把处理特殊业务异常情况的代码逻辑抽取出来放到别的类里面写,可以使代码更加清晰和可维护)

创建验证码错误异常

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Getter;
 
/**
 * @author mijiupro
 */
@Getter
public class CaptchaErrorException extends RuntimeException {
    private final ResultEnum resultEnum;//返回提示信息枚举(code,message)
 
    public CaptchaErrorException(ResultEnum resultEnum) {
        this.resultEnum = resultEnum;
    }
}

创建用户被封禁异常

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Getter;
 
/**
 * @author mijiupro
 */
@Getter
public class AccountForbiddenException extends RuntimeException {
    private final ResultEnum resultEnum;
 
    public AccountForbiddenException(ResultEnum resultEnum) {
        this.resultEnum = resultEnum;
    }
}

 创建用户注册失败异常

import com.mijiu.commom.enumerate.ResultEnum;
import lombok.Getter;

/**
 * @author mijiupro
 */
@Getter
public class AccountRegisterFailException extends RuntimeException {
    private final ResultEnum resultEnum;//返回提示信息枚举(code,message)

    public AccountRegisterFailException(ResultEnum resultEnum) {
        this.resultEnum = resultEnum;
    }
}

3.登录注册业务逻辑实现

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.mijiu.commom.enumerate.ResultEnum;
import com.mijiu.commom.exception.*;
import com.mijiu.commom.model.dto.UserLoginDTO;
import com.mijiu.commom.model.dto.UserSmsLoginDTO;
import com.mijiu.commom.model.vo.UserLoginVO;
import com.mijiu.commom.util.JwtUtils;
import com.mijiu.entity.User;
import com.mijiu.mapper.UserMapper;
import com.mijiu.service.UserService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.data.redis.core.HashOperations;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.util.DigestUtils;


import java.util.Map;
import java.util.Objects;

/**
 * <p>
 * 用户表 服务实现类
 * </p>
 *
 * @author 蒾酒
 * @since 2024-02-03
 */
@Service
@Slf4j
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {

    private final UserMapper userMapper;
    private final JwtUtils jwtUtils;
    private final StringRedisTemplate stringRedisTemplate;

    public UserServiceImpl(UserMapper userMapper, JwtUtils jwtUtils, StringRedisTemplate stringRedisTemplate) {
        this.userMapper = userMapper;
        this.jwtUtils = jwtUtils;
        this.stringRedisTemplate = stringRedisTemplate;
    }

 

    @Override
    public UserLoginVO SmsLogin(UserSmsLoginDTO userSmsLoginDTO) {
        // 校验验证码是否存在
        HashOperations<String, String, String> hashOps = stringRedisTemplate.opsForHash();
        String captcha = hashOps.get("login:sms:captcha:" + userSmsLoginDTO.getPhone(), "captcha");

        if (StringUtils.isEmpty(captcha)) {
            log.error("手机号 {} 的验证码不存在或已过期", userSmsLoginDTO.getPhone());
            throw new CaptchaErrorException(ResultEnum.USER_CAPTCHA_NOT_EXIST);
        }

        // 查询用户是否已注册
        User loginUser = new LambdaQueryChainWrapper<>(userMapper).eq(User::getPhone, userSmsLoginDTO.getPhone()).one();

        // 如果未注册则进行注册
        if (Objects.isNull(loginUser)) {
            loginUser = register(userSmsLoginDTO.getPhone());
        }

        // 校验验证码是否正确
        if (!userSmsLoginDTO.getCaptcha().equals(captcha)) {
            log.error("手机号 {} 的验证码错误", userSmsLoginDTO.getPhone());
            throw new CaptchaErrorException(ResultEnum.AUTH_CODE_ERROR);
        }
        //判断用户是否被禁用
        if (!loginUser.getStatus()) {
            throw new AccountForbiddenException(ResultEnum.USER_ACCOUNT_FORBIDDEN);
        }
        log.info("手机号 {} 用户登录成功", userSmsLoginDTO.getPhone());

        return UserLoginVO.builder()
                .token(jwtUtils.generateToken(Map.of("userId", loginUser.getId()), "user"))
                .userName(loginUser.getUserName())
                .build();
    }

    private User register(String phone) {
        User user = new User();
        user.setPhone(phone);
        user.setUserName(phone);
        user.setStatus(true);
        if (userMapper.insert(user) < 1) {
            log.error("手机号 {} 用户注册失败!", phone);
            throw new AccountRegisterFailException(ResultEnum.USER_REGISTER_FAIL);
        }
        log.info("手机号 {} 用户注册成功", phone);
        return user;
    }
}

4.测试接口

使用swagger3进行测试

Spring Boot3整合knife4j(swagger3)_springboot3 knife4j-CSDN博客文章浏览阅读2.3k次,点赞39次,收藏54次。Knife4j · 集Swagger2及OpenAPI3为一体的增强解决方案. | Knife4j (xiaominfo.com)作者的使用的spring boot 3.2.2为当前最新版,所以依赖导入最新的knife4j 4.4.0。3.1 增强模式 | Knife4j (xiaominfo.com)好一个spring boot项目且版本为3X,项目可正常启动。快速开始 | Knife4j (xiaominfo.com)接下来配置以下接口文档的作者等信息。@Tag注解:标记接口类别。_springboot3 knife4jhttps://blog.csdn.net/qq_62262918/article/details/135761392?spm=1001.2014.3001.5502

调用短信验证码发送接口

spring boot3登录开发-3(2短信验证登录/注册逻辑实现),spring boot实战,spring boot,java,redis

调用短信验证登录接口

spring boot3登录开发-3(2短信验证登录/注册逻辑实现),spring boot实战,spring boot,java,redis

第一次登录所以也就自动注册成功了。

spring boot3登录开发-3(2短信验证登录/注册逻辑实现),spring boot实战,spring boot,java,redis

写在最后

springboot实现短信验证登录注册到这里就结束了,本文介绍了一种通用的短信验证登录实现方式,代码逻辑清晰。任何问题评论区或私信讨论,欢迎指正。文章来源地址https://www.toymoban.com/news/detail-844984.html

到了这里,关于spring boot3登录开发-3(2短信验证登录/注册逻辑实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spring boot3.x 无法向 Nacos2.x进行服务注册的问题

    一:问题描述 配置中心都是可用的,但是就是无法向nacos进行服务注册。 二:问题可能出现的原因有如下两种 1.Nacos2.0版本相比1.X新增了gRPC的通信方式,因此需要增加2个端口。除了8848还需要开放9848,9849端口。 官方文档说明:Nacos 2.0.0 兼容性文档 | Nacos 2.maven依赖版本的问题

    2024年01月24日
    浏览(31)
  • spring boot3单模块项目工程搭建-上(个人开发模板)

      ⛰️个人主页:     蒾酒 🔥系列专栏 :《spring boot实战》 目录 写在前面 上文衔接 常规目录创建 common目录 exception.handle目录 result.handle目录 controller目录 service目录 mapper目录 entity目录 test目录 写在最后 本文介绍了springboot开发后端服务,单模块项目工程搭建。单模块搭建出

    2024年04月29日
    浏览(27)
  • spring boot3单模块项目工程搭建-下(个人开发模板)

    ⛰️个人主页:     蒾酒 🔥系列专栏 :《spring boot实战》 目录 写在前面 上文衔接 常用依赖介绍以及整合 web组件 测试组件 样板代码生成 数据库连接器 常用工具包 面向切面编程 ORM框架 数据连接池 接口测试、文档导出 缓存中间件 参数校验 认证鉴权 基础功能完善 跨域问

    2024年04月28日
    浏览(30)
  • 让你的Demo更安全--Spring Boot实现短信验证码

    随着移动互联网的普及,短信验证码已经成为了很多应用的常用登录和注册方式之一。在传统的应用中,我们一般使用第三方集成商提供的短信验证码服务来实现短信验证码的发送和验证,但是这些服务有可能存在时间限制、价格过高等限制。 为了解决这些问题,我们可以使

    2024年02月07日
    浏览(29)
  • Spring Security 6.0系列【15】认证篇之实现短信验证码登录功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 目前大部分网站都支持使用 手机号+短信验证码 登录,比

    2023年04月24日
    浏览(48)
  • Spring Security 6.x 系列【15】认证篇之实现短信验证码登录功能

    有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 3.0.4 本系列Spring Security 版本 6.0.2 源码地址:https://gitee.com/pearl-organization/study-spring-security-demo 目前大部分网站都支持使用 手机号+短信验证码 登录,比

    2024年02月05日
    浏览(39)
  • 手机短信验证码登录功能的开发实录(机器识别码、短信限流、错误提示、发送验证码倒计时60秒)

    短信验证码是通过发送验证码到手机的一种有效的验证码系统,作为比较准确和安全地保证购物的安全性,验证用户的正确性的一种手段,几乎网站登录都会使用该方式。 其特点是依据某些验证码接入商提供手机短信验证码服务,各网站通过接口发送请求到接入商的服务器,

    2024年02月02日
    浏览(34)
  • Spring Boot3 系列:Spring Boot3 跨域配置 Cors

    CORS,全称是“跨源资源共享”(Cross-Origin Resource Sharing),是一种Web应用程序的安全机制,用于控制不同源的资源之间的交互。 在Web应用程序中,CORS定义了一种机制,通过该机制,浏览器能够限制哪些外部网页可以访问来自不同源的资源。源由协议、域名和端口组成。当一

    2024年01月19日
    浏览(49)
  • spring boot security验证码登录示例

    在spring boot security自定义认证一文,基本给出了一个完整的自定义的用户登录认证的示例,但是未涉及到验证的使用,本文介绍登录的时候如何使用验证码。 本文介绍一个验证码生成工具,比较老的一个库了,仅作demo使用,不太建议生产用了,因为如果你的代码需要进行安全

    2024年02月12日
    浏览(31)
  • JavaWeb_瑞吉外卖_业务开发Day5-套餐管理, 短信发送, 手机验证码登录

    总结 接收List数据时, 需要加上 @RequestParam 注解 操作2个及2个以上表, 加上 @Transactional 事务注解, 保持数据的一致性. 发送短信 生成验证码 黑马程序员. 瑞吉外卖项目

    2024年02月12日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包