go Web入门登录出错

go Web入门 中,按流程走完, 注册的账号登出再次登录会提示登录错误,控制台返回

`crypto/bcrypt: hashedPassword is not the hash of the given password`

通过debug发现是因为在创建用户时,触发了beforeSave()beforeCreate() 两个钩子:

go Web入门登录出错
创建时,首先在 beforeSave()中对password字段进行了hash处理,然后在beforeCreate()中没有对password进行判断,又进行了第二次hash转换,最后存入数据库中的时候一个经过两次hash转换的password,登录时bcrypt比对时,则每次都会返回密码不匹配,所以只需要在 beforeCreate()中也加入对password字段是否hash转换的判断既可,如下图:

// BeforeCreate GORM 的模型钩子,创建模型前调用
func (user *User) BeforeCreate(tx *gorm.DB) (err error) {
   if !password.IsHashed(user.Password) {
      user.Password, err = password.Hash(user.Password)
      logger.LogError(err)
   }
   return
}

修改后用户可正常登录。

讨论数量: 3
Summer

要跟着课程来操作,一开始举例 BeforeCreate 和 BeforeUpdate 只是想让大家知道有这两个钩子,且这两个钩子如果有相同的逻辑可以使用 BeforeSave 来替代。

这篇文章里面已经使用 BeforeSave 来覆盖掉保存和更新模型前调用了。

1年前 评论

BeforeSave 钩子函数执行的时间比 BeforeCreate 要先。

1年前 评论
一个一个人 (楼主) 1年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!