Gorm加解密插件

gorm-plugin-crypto

通過Gorm插件拘鞋,加解密數(shù)據(jù)砚蓬,代碼入侵率低。

  • 默認內置了AES加解密策略
  • 自定義多種加解密策略掐禁,通過tag指定策略

使用步驟:

  1. 引入包
go get -u github.com/kangarooxin/gorm-plugin-crypto
  1. 注冊插件怜械,注冊默認的加解密策略
db, _ = gorm.Open(sqlite.Open("test.db"), &gorm.Config{})
db.Use(crypto.NewCryptoPlugin())
// 注冊默認的AES加解密策略
RegisterCryptoStrategy(crypto.NewAesCryptoStrategy("1234567890123456"))
db.AutoMigrate(&User{})

  1. 使用tag標記struct字段
type User struct {
    ID     uint   `gorm:"primarykey"`
    Name   string `gorm:"column:name"`
    Age    int    `gorm:"column:age"`
    Email  string `gorm:"column:email" crypto:"aes"`
    Mobile string `gorm:"column:mobile" crypto:"aes"`
}
  1. 自定義加解密策略,實現(xiàn)CryptoStrategy接口傅事。
// 注冊加解密策略
crypto.RegisterCryptoStrategy(MyAesCryptoStrategy("1234567890123456"))

// 使用自定義的策略tag標記
Email  string `gorm:"column:email" crypto:"myAes"`
  1. 開始使用:

插入數(shù)據(jù)

user1 := &User{ID: 1, Name: "User1", Age: 18, Email: "user1@example.com", Mobile: "13812345671"}
user2 := &User{ID: 2, Name: "User2", Age: 12, Email: "user2@example.com", Mobile: "13812345672"}
user3 := &User{ID: 3, Name: "User3", Age: 16, Email: "user3@example.com", Mobile: "13812345673"}

// 單個插入
db.Create(user1)
assert.Equal(t, "{AES}g+2fA4EbDGDPpZVCF0quCwjz4w22BRHHb0xqEG86zL0=", user1.Email)
assert.Equal(t, "{AES}Q/FDK7HDVHpArPRm3kCwEw==", user1.Mobile)

// 批量插入
users := []*User{user2, user3}
db.Create(users)
assert.Equal(t, "{AES}VNrSbyrCwXfcBIoxYbO8hgjz4w22BRHHb0xqEG86zL0=", user2.Email)
assert.Equal(t, "{AES}yRPUirBKNe9UFlIStzft/gjz4w22BRHHb0xqEG86zL0=", user3.Email)

查詢

// 通過主鍵查詢
var queryUser User
db.First(&queryUser, 1)
assert.Equal(t, "user1@example.com", queryUser.Email)
assert.Equal(t, "13812345671", queryUser.Mobile)

// 通過主鍵批量查詢
var queryUsers []User
db.Find(&queryUsers, []int{1, 2, 3})
assert.Equal(t, "user1@example.com", queryUsers[0].Email)
assert.Equal(t, "13812345672", queryUsers[1].Mobile)

// 查詢全部
var queryAllUsers []User
db.Find(&queryAllUsers)
assert.Equal(t, "user1@example.com", queryUsers[0].Email)
assert.Equal(t, "13812345672", queryUsers[1].Mobile)

// 通過自定義條件查詢
var queryUser1 User
db.Where("name = ?", "User1").First(&queryUser1)
assert.Equal(t, "user1@example.com", queryUser1.Email)
assert.Equal(t, "13812345671", queryUser1.Mobile)

// 通過加密字段查詢時缕允,由于無法識別模型,所以需要手動加密數(shù)據(jù)蹭越,可以通過`NewCryptoValue` 包裝實現(xiàn)加密障本。
var queryUser2 User
db.Where("email = ?", NewCryptoValue("email", "user1@example.com")).First(&queryUser2)
assert.Equal(t, "user1@example.com", queryUser2.Email)
assert.Equal(t, "13812345671", queryUser2.Mobile)

// 通過Struct條件查詢
var queryUser4 User
db.Where(&User{Email: "user1@example.com"}).First(&queryUser4)
assert.Equal(t, "13812345671", queryUser4.Mobile)

// 通過Map查詢
var queryUser5 User
db.Where(map[string]interface{}{"email": "user1@example.com"}).First(&queryUser5)
assert.Equal(t, "13812345671", queryUser5.Mobile)

// 通過Map In 查詢
var queryUser6 []User
db.Where(map[string]interface{}{
"email": []string{"user1@example.com", "user2@example.com"},
}).Find(&queryUser6)
assert.Equal(t, "13812345671", queryUser6[0].Mobile)
assert.Equal(t, "13812345672", queryUser6[1].Mobile)

// 通過原生Sql查詢
var queryUser3 User
db.Raw("select * from test_user").Find(&queryUser3)
assert.Equal(t, "user1@example.com", queryUser3.Email)

保存和更新

// 有主鍵的保存,執(zhí)行更新操作
var saveUser User
db.First(&saveUser)
saveUser.Email = "User11@example.com"
db.Save(&saveUser)
assert.Equal(t, "{AES}siKVK6qMulucOlmRoZWLiWcZIqVzlNkqP58lypIfHtg=", saveUser.Email)

// 無主鍵的保存,執(zhí)行插入操作
user4 := &User{Name: "User4", Age: 18, Email: "user4@example.com", Mobile: "13812345674"}
db.Save(user4)
assert.Equal(t, "{AES}g1WxCfYDcw/2k5g9kyFDpAjz4w22BRHHb0xqEG86zL0=", user4.Email)

//使用 `struct`更新
db.Model(&User{}).Where("id = ?", 1).Update("email", "user111@example.com")
var queryUser7 User
db.First(&queryUser7, 1)
assert.Equal(t, "user111@example.com", queryUser7.Email)

// 使用 `map`更新
db.Model(&User{}).Where("id = ?", 2).Updates(map[string]interface{}{"email": "user222@example.com"})
var queryUser8 User
db.First(&queryUser8, 2)
assert.Equal(t, "user222@example.com", queryUser8.Email)
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末驾霜,一起剝皮案震驚了整個濱河市案训,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌粪糙,老刑警劉巖强霎,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蓉冈,居然都是意外死亡城舞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進店門寞酿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來家夺,“玉大人,你說我怎么就攤上這事伐弹±觯” “怎么了?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵惨好,是天一觀的道長煌茴。 經(jīng)常有香客問我,道長日川,這世上最難降的妖魔是什么景馁? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮逗鸣,結果婚禮上合住,老公的妹妹穿的比我還像新娘。我一直安慰自己撒璧,他們只是感情好透葛,可當我...
    茶點故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著卿樱,像睡著了一般僚害。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上繁调,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天萨蚕,我揣著相機與錄音,去河邊找鬼蹄胰。 笑死岳遥,一個胖子當著我的面吹牛,可吹牛的內容都是我干的裕寨。 我是一名探鬼主播浩蓉,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼派继,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了捻艳?” 一聲冷哼從身側響起驾窟,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎认轨,沒想到半個月后绅络,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡嘁字,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年昨稼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拳锚。...
    茶點故事閱讀 40,115評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖寻行,靈堂內的尸體忽然破棺而出霍掺,到底是詐尸還是另有隱情,我是刑警寧澤拌蜘,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布杆烁,位于F島的核電站,受9級特大地震影響简卧,放射性物質發(fā)生泄漏兔魂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一举娩、第九天 我趴在偏房一處隱蔽的房頂上張望析校。 院中可真熱鬧,春花似錦铜涉、人聲如沸智玻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吊奢。三九已至,卻和暖如春纹烹,著一層夾襖步出監(jiān)牢的瞬間页滚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工铺呵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留裹驰,地道東北人。 一個月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓片挂,卻偏偏與公主長得像邦马,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,055評論 2 355

推薦閱讀更多精彩內容