用户名密码验证存服务端session+验证码验证+session存取判断

用户名密码验证存服务端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不存在",
		})
	}
posted @ 2021-11-02 17:33  成强  阅读(376)  评论(0)    收藏  举报