用户中心4-后端实现用户登录

日期:2024.02.24 作者:31520-tfzhang

 

用户登录的流程:

后台登录时,需要接受的参数:用户账户,密码;

网络请求类型:POST

返回值:返回当前用户的基本信息;数据要脱敏;不要返回相关隐私;返回json格式数据;

 

1、登录逻辑

与注册逻辑类似,登录的逻辑包括:

1、用户名和密码非空;

2、账户长度不小于4,密码不小于8,账户不包含特殊字符;

3、密码是否正确,需要查询数据库;

4、数据脱敏,敏感信息要隐藏,不能返回;

5、记录登录态,将用户登录状态保存在后端;

 

2、代码框架:

书写登录业务代码涉及到文件,与注册类似:

在service中的接口UserService.java中定义登录方法:

 

在service的实现类中UserServiceImpl.java实现userLogin的代码:

 

在test/java/com.tfzhang.backend/service/UserServiceTest.java中创建测试文件:

 

3、业务代码实现:

接下来主要在UserServiceImpl.java中实现各种逻辑的代码,其中与注册类似的代码,可以直接借用:

1、用户名和密码非空;

2、账户长度不小于4,密码不小于8,账户不包含特殊字符;

 

3、密码是否正确,需要查询数据库;

校验密码是否正确,注意数据库中保存的是加密后的数据,所以我们也要对密码数据先加密,然后再与数据库中的对比;

此处的userMapper对象要定义为私有类属性,并添加Resource标签;

 

4、数据脱敏,敏感信息要隐藏,不能返回;

登录返回用户的数据,其中的敏感数据要屏蔽,才能返回数据给前端。所谓的屏蔽只是调用下set方法。

 

5、记录登录态,将用户登录状态保存在后端;

后端只有保存用户的登录态,才能知道连接时,该连接来自哪个用户,前端和后端用户登录态的交互过程如下:

  1. 连接服务器端后,得到一个 session 状态(匿名会话),返回给前端

  2. 登录成功后,得到了登录成功的 session,并且给该session设置一些值(比如用户信息),返回给前端一个设置 cookie 的 ”命令“

    session => cookie

  3. 前端接收到后端的命令后,设置 cookie,保存到浏览器内

  4. 前端再次请求后端的时候(相同的域名),在请求头中带上cookie去请求

  5. 后端拿到前端传来的 cookie,找到对应的 session

  6. 后端从 session 中可以取出基于该 session 存储的变量(用户的登录信息、登录名)

后端的代码只要添加如下:

其中的request参数来自前端,需要修改userLogin方法的声名:

 

4、业务代码的优化:

将上述所有的业务代码片段整合后,得到如下:

仔细审视上述的代码,看看有没有优化的空间?

 

对于上述的第一点,我们在/src/main/java/com.tfzhang.backend/下创建名为constant的package,其中再创建名为UserConstant的interface,其中的代码:

然后再修改登录中的代码:

 

对于第2点,我们在当前文件夹下创建一个getSafetyUser方法:

然后原来的代码直接调用上述的getSafetyUser即可。

 

5、数据库中用户的逻辑删除设置:

我们之前在设计数据库中有提到过一个逻辑删除的变量: isDelete

该变量表示当前的数据是否已经逻辑删除,逻辑删除是指:数据仍在数据库中,但是不会被查找;对外不可见。

比如:如果我们登录一个被逻辑删除的账号,那么即使账户名和密码都对,数据库也应该显示无该数据。那么mybatis-plus要做到的这一点,需要进行如下的配置(搜官方文档):

步骤1:配置application.yml

步骤2:实体字段上加注解;

对照我们的项目,我们需要在application.yml文件中,添加如下的内容:

在User.java中添加注解:

 

登录部分的测试代码我们不写了,因为与注册基本类似,下面我们写controller层的网络访问接口代码。