我的个人博客已经上线,接下来的内容我会记录在个人博客中,欢迎来踩qaq。。。
windy Xu's Site (xuchengyu1212.cloud)
接下来我会在个人博客中更新Docker相关内容以及如何在docker中部署redis缓存池。欢迎围观
之前一节课呢,我们成功实现了加密的操作,接下来我们来实现一下登录功能。
通过用户名和密码检索用户信息
为models中的user_basic.go文件中添加FindUserByNameAndPwd方法,用来通过名字和密码检索表数据:
func FindUserByNameAndPwd(name, password string) UserBasic {
user := UserBasic{}
utils.DB.Where("name = ? and password = ?", name, password).First(&user)
return user
}
完成这一步之后呢,在service方法中添加登录方法:
// FindUserByNameAndPwd
// @Summary 查找单个用户
// @Tags 用户模块
// @param name query string false "用户名"
// @param password query string false "密码"
// @Success 200 {string} json{"code", "message"}
// @Router /user/getUserList [post]
func FindUserByNameAndPwd(c *gin.Context) {
data := models.UserBasic{}
name := c.Query("name")
password := c.Query("password")
user := models.FindUserByName(name)
if user.Name == "" {
c.JSON(200, gin.H{
"code": -1,
"message": "该用户不存在",
"data": data,
})
return
}
fmt.Println(user)
flag := utils.ValidPassword(password, user.Salt, user.Password)
if !flag {
c.JSON(200, gin.H{
"code": -1,
"message": "密码不正确",
"data": data,
})
return
}
pwd := utils.MakePassword(password, user.Salt)
data = models.FindUserByNameAndPwd(name, pwd)
c.JSON(200, gin.H{
"code": 0, //0成功 -1失败
"message": "登录成功",
"data": data,
})
}
接下来在路由文件中引入这个方法:
r.POST("/user/findUserByNameAndPwd", service.FindUserByNameAndPwd)
即可成功完成查找用户的功能,我们可以试验一下,运行main.go文件,使用apiPost等接口调试工具,测试一下是否可以成功检索到用户数据:
登录状态的持久化
为了保证登录状态的时效性,我们需要为返回的数据中携带token。
在网络请求中,Token 通常指代一种身份验证令牌,用于验证用户的身份并授权其访问受保护的资源。Token 是一种轻量级的身份验证机制,通常由服务器生成并返回给客户端。客户端将 Token 存储在本地,然后在后续的请求中发送给服务器。
以下是 Token 的一些常见用途:
- API 认证:许多 Web API 需要用户进行身份验证才能访问。通过在请求头中包含 Token,服务器可以验证用户的身份并允许其访问相应的资源。
- 授权和权限控制:Token 可以用于授权和权限控制。例如,在一个社交网络应用中,用户可以使用他们的 Token 来查看其他用户的信息或发表自己的内容。
- 单点登录(SSO):当用户在一个应用程序中登录后,该应用程序可以将 Token 保存在本地。当用户尝试访问另一个受保护的应用程序时,该应用程序可以通过发送一个包含 Token 的请求来验证用户的身份。
token应该是具有时效性的,这一点在后续的redis学习中会教给大家,我们首先学习生成最基本的token:
添加最基本的token信息
在之前编写的FindUserByNameAndPwd方法中添加生成token的方法:
func FindUserByNameAndPwd(name, password string) UserBasic {
user := UserBasic{}
utils.DB.Where("name = ? and password = ?", name, password).First(&user)
//token加密
str := fmt.Sprintf("%d", time.Now().Unix())
temp := utils.Md5Encode(str)
utils.DB.Model(&user).Where("id = ?", user.ID).Update("identity", temp)
return user
}
我们先生成一个随机数,然后使用md5的规则将随机数序列化并且保存到用户表的identity中。 测试一下token是否添加到identity字段中,运行main.go文件,并且调用查询用户的方法,查看数据库文件:
可以看到identity已经保存了一组数据,这个就是最简单的token数据了。