情景:用户登录时,出现密码错误,错误发生在service/user_login.go: line41
环境:golang、gorm、mysql
错误出现在登录时密码校对中:
err := bcrypt.CompareHashAndPassword(hashpassword, mypassword)
问题原因一:
引用自stackflow:https://stackoverflow.com/questions/51008351/bcrypt-hashedsecret-too-short-to-be-a-bcrypted-password
因为在创建User{}
表时,指定password
字段长度不够,导致数据库自动截断了后面的password
。
type User struct {
Id int64 `gorm:"column:id;primary_key;AUTO_INCREMENT"`
Name string `gorm:"column:name;not null"`
// 下面这个字段,type:varchar(50)长度不足
Password string `gorm:"column:password;type:varchar(50);not null"`
}
解决方案一:
更改字段长度:
type User struct {
Id int64 `gorm:"column:id;primary_key;AUTO_INCREMENT"`
Name string `gorm:"column:name;not null"`
Password string `gorm:"column:password;type:varchar(100);not null"`
}
问题原因二及其解决方案
粗心大意,将hasspassword
和mypassword
搞反了,此处hasspassword
应该是数据库表中的password
,mypassword
应该是本次输入的password
,函数参数中,将hasspassword
放在mypassword
之前。
hashpassword := []byte(user.Password) //数据库存储的加密哈希
mypassword := []byte(f.password) //登录输入的明文密码
err := bcrypt.CompareHashAndPassword(hashpassword, mypassword)