我有一個帶有 GORM 的 Go 應用程序,我試圖在每次更新時散列用戶的密碼字段。為此,我使用了BeforeUpdateGORM 提供的鉤子。我面臨的問題是,在上述掛鉤上Password,用戶 ( u.password) 的字段具有已存儲在數據庫中的舊哈希密碼值,而不是newPassword我更新它的值。因此,當我對鉤子上的密碼進行哈希處理時,我實際上只是在對已經進行哈希處理的舊密碼進行哈希處理。我的BeforeUpdate鉤子:func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { if (tx.Statement.Changed("Password")) { bytePassword := []byte(u.Password) // Old password value here! passwordHash, err := bcrypt.GenerateFromPassword(bytePassword, bcrypt.DefaultCost) if (err != nil) { return err } tx.Statement.SetColumn("password", string(passwordHash)) } return nil}更新是這樣觸發的:var user models.Usererr := db.First(&user, id).Errorif (err != nil) { log.Fatal(err) }// Not sure how to access this "newPassword" value on the "BeforeUpdate" hookerr = db.Model(&user).Update("password", newPassword).Errorif (err != nil) { log.Fatal(err) }編輯:工作解決方案感謝@s3vt 的回答只需要改變我的BeforeUpdate鉤子:func (u *User) BeforeUpdate(tx *gorm.DB) (err error) { if (tx.Statement.Changed("Password")) { u.Password = tx.Statement.Dest.(map[string]interface{})["password"].(string) bytePassword := []byte(u.Password) passwordHash, err := bcrypt.GenerateFromPassword(bytePassword, bcrypt.DefaultCost) if (err != nil) { return err } tx.Statement.SetColumn("password", string(passwordHash)) } return nil}
Go GORM - BeforeUpdate 字段有舊值
慕桂英3389331
2023-02-06 14:42:46