为了账号安全,请及时绑定邮箱和手机立即绑定

使用 BeforeUpdate 的 gorm 哈希密码不会使用哈希值更新密码

使用 BeforeUpdate 的 gorm 哈希密码不会使用哈希值更新密码

Go
BIG阳 2022-06-27 10:04:23
我有一个非常简单的User模型,我的整个模型main.go如下package mainimport (  "fmt"  "github.com/jinzhu/gorm"  _ "github.com/jinzhu/gorm/dialects/mysql"  "golang.org/x/crypto/bcrypt")// User : the user data modeltype User struct {  gorm.Model  Username string `gorm:"type:varchar(40);unique" json:"username,omitempty"`  Password string `gorm:"size:255" json:"password,omitempty"`}// BeforeSave : hook before a user is savedfunc (u *User) BeforeSave(scope *gorm.Scope) (err error) {  fmt.Println("before save")  fmt.Println(u.Password)  if u.Password != "" {     hash, err := MakePassword(u.Password)     if err != nil {        return nil     }     u.Password = hash  }  fmt.Println(u.Password)  return}// MakePassword : Encrypt user passwordfunc MakePassword(password string) (string, error) {  bytes, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)  return string(bytes), err}func main() {  var connectionString = fmt.Sprintf(    "%s:%s@/%s?charset=utf8&parseTime=True&loc=Local",    "root", "password", "project",  )  db, _ := gorm.Open("mysql", connectionString)  db.AutoMigrate(&User{})  db.Save(&User{    Username: "name1",    Password: "123",  })  db.Model(&User{    Model: gorm.Model{ID: 1},  }).Update(&User{    Username: "name2",    Password: "12345",  })}我第一次创建密码并保存为哈希字符串(我注释掉了第二个更新部分并测试了它),但是当我更新它时,它被保存为纯文本。从控制台,我可以看到Println消息,BeforeUpdate被触发,我看到它的纯密码和 MD5,但在数据库中,它被保存为纯文本。before save123$2a$10$Vknv/uu7tAPRQSddPVlQ7OodIHZJmRPKktjb98U8U5.GT/OLQeQE2before save12345$2a$10$K0ZkLH7slfiFmkOe5DTKr.DGNvR6HtpjxCS/1svf2ZEvfTXVkMkvu关于如何修复它的任何想法?
查看完整描述

2 回答

?
米脂

TA贡献1836条经验 获得超3个赞

根据文档,为了更改正在更新的值,您必须通过 gorm Scope 参数设置它们。在这种情况下, User 结构并不意味着用于修改。您应该改用 SetColumn。


// BeforeUpdate : hook before a user is updated

func (u *User) BeforeUpdate(scope *gorm.Scope) (err error) {

    fmt.Println("before update")

    fmt.Println(u.Password)


    if u.Password != "" {

        hash, err := MakePassword(u.Password)

        if err != nil {

            return nil

        }

        scope.SetColumn("Password", hash)

    }


    fmt.Println(u.Password)

    return

}


查看完整回答
反对 回复 2022-06-27
?
一只萌萌小番薯

TA贡献1795条经验 获得超7个赞

我认为问题是在这里你更新用户时有一个触发器,你可以在这里改变逻辑,你的密码不应该散列,希望对你有好处


func (u *User) BeforeSave(scope *gorm.Scope) (err error) {

 fmt.Println("before save")

 fmt.Println(u.Password)

 if u.Password != "" {

 hash, err := MakePassword(u.Password)

 if err != nil {

    return nil

 }

 u.Password = hash

 }


 fmt.Println(u.Password)

 return

}


查看完整回答
反对 回复 2022-06-27
  • 2 回答
  • 0 关注
  • 199 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信