044 用户注册功能04--完成注册功能
实现用户注册功能,需要对用户密码进行加密存储,使用MD5加密,加密过程中使用随机码作为salt加盐。另外还需要对用户输入的短信验证码进行校验。
1.接口说明
(1)接口路径:
POST /register
(2)返回结果:
-
201:注册成功
-
400:参数有误,注册失败
-
-
1)校验短信验证码
-
2)生成盐
-
3)对密码加密
-
4)写入数据库
-
/** * 注册 * @param user 接收用户对象信息(form表单提交,user对象进行接收) * @param code 接收表单参数--手机验证码 * @return */ @PostMapping("register") public ResponseEntity<Void> register(User user, @RequestParam("code") String code) { Boolean boo = this.userService.register(user, code); if (boo == null || !boo) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } return new ResponseEntity<>(HttpStatus.CREATED); }
3.UserService
/** * 用户注册功能 * @param user * @param code * @return */ public Boolean register(User user, String code) { // 校验短信验证码 String cacheCode = this.redisTemplate.opsForValue().get(KEY_PREFIX + user.getPhone()); if (!StringUtils.equals(code, cacheCode)) { return false; } // 生成盐 String salt = CodecUtils.generateSalt(); user.setSalt(salt); // 对密码加密 user.setPassword(CodecUtils.md5Hex(user.getPassword(), salt)); // 强制设置不能指定的参数为null user.setId(null); user.setCreated(new Date()); // 添加到数据库 boolean b = this.userMapper.insertSelective(user) == 1; if(b){ // 注册成功,删除redis中的记录 this.redisTemplate.delete(KEY_PREFIX + user.getPhone()); } return b; }
此处使用了CodeUtils:
该工具类需要apache加密工具包:
<dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> </dependency>
4.测试
我们通过PostMan测试:
http://api.leyou.com/api/user/register?username=lucky&password=plj824&phone=17826828544&code=984971
查看数据库:
5.
我们这里会使用Hibernate-Validator框架完成数据校验:
(1)
官网:
(3)
<dependency> <groupId>org.hibernate.validator</groupId> <artifactId>hibernate-validator</artifactId> </dependency>
我们在User对象的部分属性上添加注解:
package lucky.leyou.user.domain; import com.fasterxml.jackson.annotation.JsonIgnore; import org.hibernate.validator.constraints.Length; import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import javax.validation.constraints.Pattern; import java.util.Date; @Table(name = "tb_user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Length(min = 4, max = 30, message = "用户名只能在4~30位之间") private String username;// 用户名 @JsonIgnore @Length(min = 4, max = 30, message = "密码只能在4~30位之间") private String password;// 密码 @Pattern(regexp = "^1[35678]\\d{9}$", message = "手机号格式不正确") private String phone;// 电话 private Date created;// 创建时间 @JsonIgnore //对象序列化为json字符串时,忽略该属性 private String salt;// 密码的盐值 public Long getId() { return id; } public void setId(Long id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } public void setPhone(String phone) { this.phone = phone; } public Date getCreated() { return created; } public void setCreated(Date created) { this.created = created; } public String getSalt() { return salt; } public void setSalt(String salt) { this.salt = salt; } }
(5)
(6)
6.
GET /query
参数说明
{ "id": 6572312, "username":"test", "phone":"13688886666", "created": 1342432424 }
-
200:注册成功
-
400:用户名或密码错误
-
/** * 根据用户名和密码查询用户 * @param username * @param password * @return */ @GetMapping("query") public ResponseEntity<User> queryUser( @RequestParam("username") String username, @RequestParam("password") String password ) { User user = this.userService.queryUser(username, password); if (user == null) { return ResponseEntity.status(HttpStatus.BAD_REQUEST).build(); } return ResponseEntity.ok(user); }
(2)service
/** * 根据用户名和密码进行登录 * @param username 用户名 * @param password 密码 * @return */ public User queryUser(String username, String password) { // 查询 User record = new User(); record.setUsername(username); User user = this.userMapper.selectOne(record); // 校验用户名 if (user == null) { return null; } // 校验密码 if (!user.getPassword().equals(CodecUtils.md5Hex(password, user.getSalt()))) { return null; } // 用户名密码都正确 return user; }
要注意,查询时也要对密码进行加密后判断是否一致。
(3)
7.
在注册页填写信息:
提交发现页面自动跳转到了登录页,查看数据库:
分类:
乐优商城项目
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)