ChatViewer
  1. 用户
ChatViewer
  • 用户
    • 用户接口
    • 发送验证码
      GET
    • 用户登录
      POST
    • 用户注册
      POST
    • 用户修改信息
      PUT
    • 用户信息
      GET
  • 分类
    • 分类目录接口
    • 查询分类目录
      GET
    • 删除分类
      DELETE
    • 插入分类路径
      POST
    • 插入子分类
      POST
  • ChatGPT
    • GPT会话列表
      GET
    • 新建会话
      POST
    • 删除会话
      DELETE
    • 消息记录
      GET
    • 发送消息
      POST
  • 文章
    • 文章详情查询
      GET
    • 文章分页查询
      GET
    • 上传文件
      POST
    • 上传文章
      POST
  • 点赞
    • 点赞/取消点赞
      POST
    • 点赞状态查询
      GET
  • 评论
    • 评论查询
      GET
    • 添加评论
      POST
  • 聊天
    • 会话查询
    • 聊天记录
    • 发送消息
    • 设置已读
  • 通知
    • 通知
    • 通知摘要
    • 通知查询
    • 设为已读
  • 问题
    • 问题分页查询
    • 添加问题
    • 问题查询
    • 回答查询
    • 保存回答
    • 求助GPT
  • 购买token
    • 添加商品
    • 秒杀免费商品
  1. 用户

用户接口

数据库blog_user表结构 :
image.png

1.1 发送验证码#

该接口不必登录:
在Service层中首先使用FommatChecker类校验phone合法性
调用SendSms类的String sendMessage(String phoneNumbers)方法:
为了避免发布时造成的密码泄露,将key写在application.yml中,使用@Value注解进行加载。
使用阿里云SDK进行相关设置,发送短信

1.2 用户登录#

提供两种登录方式:
1.
手机号-验证码登录:与Redis中存储的验证码进行比较,一致则可以登录
2.
手机号-密码登录:令UserService实现UserDetailsService接口,利用SpringSecurity中AuthenticationManager类的.authenicate方法。
实现:
校验手机号格式是否正确
当验证码不为null时,使用验证码登录;否则使用密码登录。
生成用户的Jwt Token(PayLoad为User Id),存入Redis
返回token与用户信息

1.2.1 手机号-密码登录#

利用了SpringSecuirty的相关接口方法(或者也可以自己实现一个加密器和ContextHolder
1.
UserService实现接口UserDetailsService,重写loadUserByUsername方法,返回该查找键(此处为phone)对应的UserDetail类对象:
2.
设置AuthenticationManager类对象,需要的参数包括对密码进行加密编码的PasswordEncoder和步骤1中的UserDetailsService。
3.
调用AuthenticationManager对象的.authenication方法完成对密码的验证。
image.png

1.2.2 JWT的生成与验证#

JWTString=Base64(Header).Base64(Payload).HMACSHA256[Base64(Header).Base64(Payload),secret]
header和payload可以直接利用base64解码出原文,从header中获取哈希签名的算法,从payload中获取有效数据。
signature由于使用了不可逆的加密算法,无法解码出原文,它的作用是校验token有没有被篡改。
服务端获取header中的加密算法之后,利用该算法加上secretKey对header、payload进行加密,比对加密后的数据和客户端发送过来的是否一致。
注意secretKey只能保存在服务端,而且对于不同的加密算法其含义有所不同,一般对于MD5类型的摘要加密算法,secretKey实际上代表的是盐值。
注意:由于PayLoad仍然是可解密的,所以不建议在PayLoad中存放敏感信息。
JWT工具类的实现在JwtUtil.java类中。
JwtFilter的实现JwtAuthenticationTokenFilter继承了OncePerRequestFilter :
request.getHeader("token")若用户请求不携带token,直接放行
若携带token,调用JwtUtil类解析userId
若解析成功,存入SecurityContextHolder中

1.3 用户注册#

Controller层验证手机号、验证码、密码的格式合法性
Service层校验与Redis中验证码是否相同
检查用户是否存在,如果不存在,创建用户
返回token与用户信息组成的Map

1.4 修改用户信息#

校验SecurityContextHolder中的用户id,是否与请求Body中的用户id相同
敏感信息字段设置为null,不允许更新
更新数据库
返回更新后的UserDto
修改于 2023-09-24 07:48:18
下一页
发送验证码
Built with