用户名密码验证存服务端session+验证码验证+session存取判断
定义操作数据库表的结构体 /models/manager.go
package models
type Manager struct {
Id int
Username string
Password string
Mobile int
Email string
Status int
RoleId int
AddTime int
IsSuper int
}
//表示配置操作数据库的表名称
func (Manager) TableName() string {
return "manager"
}
控制器中进行调用controllers/login.go
func (con LoginController) DoLogin(c *gin.Context) {
//获取前端传过来验证码的CaptchaId和verifyValue
captchId := c.PostForm("captchaId")
verifyValue := c.PostForm("verifyValue")
username := c.PostForm("username")
password := c.PostForm("password")
fmt.Println(models.Md5("123456"))
//1、验证验证码是否正确(防止别人进行工具)
//排除前端提交的空请求(字符串前后空格)strings.Trim(str," ")
if strings.Trim(captchId, " ") == "" || strings.Trim(verifyValue, " ") == "" {
c.JSON(http.StatusOK, gin.H{
"code": 400,
"msg": "验证码验证失败,前端提交的空请求(字符串前后空格)",
"verifyValueResult": false,
})
return
}
//调用验证验证码的方法
if flag := models.VerifyCaptcha(captchId, verifyValue); flag == true {
//验证通过:再去执行登录操作
//2、查询数据库 判断用户以及密码是否存在
userinfoList := []models.Manager{}
//对前端传过来的密码进行Md5加密
password = models.Md5(password)
//把查询结果=所有字段保存到userinfo(传入地址)
models.DB.Where("username = ? AND password = ?", username, password).Find(&userinfoList)
fmt.Println("查询数据库成功")
//fmt.Println(username)
//fmt.Println(password)
//if username =="admin" && password =="123456" {
if len(userinfoList) > 0 {
//3、执行登录 保存用户信息(cookies:客户端 sessions:服务器端) 执行跳转
//创建sesson
session := sessions.Default(c)
//保存用户信息,sessions:服务器端
//session.Set不能直接保存切片,把结构体转换成json字符串
userinfoSlice,_:=json.Marshal(userinfoList)
session.Set("userinfo", string(userinfoSlice))
session.Save()
//提示登录成功信息
c.JSON(http.StatusOK, gin.H{
"code": 200,
"msg": "验证码验证成功,登录成功",
"verifyValueResult": "true",
"login": "true",
})
} else {
//登录失败
c.JSON(http.StatusOK, gin.H{
"code": 400,
"msg": "验证码验证成功,用户名密码错误",
"verifyValueResult": "true",
"login": "false",
})
}
fmt.Println(flag)
} else {
//验证失败
c.JSON(http.StatusOK, gin.H{
"code": 400,
"msg": "验证码验证失败",
"verifyValueResult": "false",
"login": "false",
})
}
}
使用了session的中间件
r.Use(middlewares.CORSMiddleware(), sessions.Sessions("mysession", store))
登录成功后:把登录信息存到session中,注意不能直接存切片,要先转换为json字符串,再存进去;
userinfoSlice,_:=json.Marshal(userinfoList)
session.Set("userinfo", string(userinfoSlice))
取出session中的信息,先把json字符串转换为切片,再作为参数返回给前端
//获取userinfo 对应的session
session :=sessions.Default(c)
userinfo :=session.Get("userinfo")//获取的session中保存的用户登录信息
//类型断言 来判断 userinfo是不是一个string
userinfoStr,ok :=userinfo.(string)//判断
if ok{
//是字符串
var userinfoStruct []models.Manager
//把字符转换成结构体(Manager)对应的切片
json.Unmarshal([]byte(userinfoStr),&userinfoStruct)
fmt.Println(userinfoStruct)
c.JSON(200, gin.H{
"username":userinfoStruct[0].Username,
})
}else{
c.JSON(200, gin.H{
"code":400,
"msg":"session不存在",
})
}