高效封禁:利用Go封裝功能,提升封禁操作效率
本篇為封禁業(yè)務(wù)篇,會講講封禁業(yè)務(wù)的實現(xiàn),給庫/框架增加新的功能。
源碼:https://github.com/weloe/token-go
思路
封禁業(yè)務(wù)也是在一般項目中比較常見的業(yè)務(wù)。我們也將它封裝在庫中作為功能之一。
我們同樣使用adapter作為底層的存儲結(jié)構(gòu),將封禁標示作為k-v結(jié)構(gòu)存儲。
把id和服務(wù)名稱service作為key,把封禁的級別level作為value,以此我們能實現(xiàn)一些比較常見的封禁業(yè)務(wù)。
實現(xiàn)
首先就是封禁方法,首先當然要校驗一下參數(shù),然后存儲封禁標識。要注意的就是level要大于等于1,在封禁后也要調(diào)用我們的logger和watcher。
https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L390
// Banned ban user, if time == 0,the timeout is not set func (e *Enforcer) Banned(id string, service string, level int, time int64) error { if id == "" || service == "" { return fmt.Errorf("parameter cannot be nil") } if level < 1 { return fmt.Errorf("unexpected level = %v, level must large or equal 1", level) } err := e.adapter.SetStr(e.spliceBannedKey(id, service), strconv.Itoa(level), time) if err != nil { return err } // callback e.logger.Ban(e.loginType, id, service, level, time) if e.watcher != nil { e.watcher.Ban(e.loginType, id, service, level, time) } return nil }
再來就是解除封禁的實現(xiàn),很簡單,只要刪除我們封禁存的那條記錄就可以了。
// UnBanned Unblock user account func (e *Enforcer) UnBanned(id string, services ...string) error { if id == "" { return fmt.Errorf("parmeter id can not be nil") } if len(services) == 0 { return fmt.Errorf("parmeter services length can not be 0") } for _, service := range services { err := e.adapter.DeleteStr(e.spliceBannedKey(id, service)) if err != nil { return err } e.logger.UnBan(e.loginType, id, service) if e.watcher != nil { e.watcher.UnBan(e.loginType, id, service) } } return nil }
接著還需要提供幾個方便使用的方法
分別用來判斷是否被封禁,獲得封禁的級別,獲得封禁的剩余時間三個方法
https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L434
判斷是否被封禁
// IsBanned if banned return true, else return false func (e *Enforcer) IsBanned(id string, services string) bool { s := e.adapter.GetStr(e.spliceBannedKey(id, services)) return s != "" }
https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L441
獲得封禁的級別
// GetBannedLevel get banned level func (e *Enforcer) GetBannedLevel(id string, service string) (int64, error) { str := e.adapter.GetStr(e.spliceBannedKey(id, service)) if str == "" { return 0, fmt.Errorf("loginId = %v, service = %v is not banned", id, service) } time, err := strconv.ParseInt(str, 10, 64) if err != nil { return 0, err } return time, nil }
https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#L454
獲得封禁的剩余時間
// GetBannedTime get banned time func (e *Enforcer) GetBannedTime(id string, service string) int64 { timeout := e.adapter.GetStrTimeout(e.spliceBannedKey(id, service)) return timeout }
有了這幾個方法,我們就可以使用token-go更為方便是實現(xiàn)登錄業(yè)務(wù)了。
對于一般的業(yè)務(wù),我們其實可以無視封禁級別。只需要使用Banned()
進行封禁,在每個需要校驗是否被封禁的業(yè)務(wù)前進行IsBanned()
的判斷就行了。
測試例子:
func TestEnforcer_Banned(t *testing.T) { err, enforcer, _ := NewTestEnforcer(t) if err != nil { t.Fatalf("NewTestEnforcer() failed: %v", err) } err = enforcer.Banned("1", "comment", 1, 100) if err != nil { t.Fatalf("Banned() failed: %v", err) } isBanned := enforcer.IsBanned("1", "comment") if !isBanned { t.Errorf("unexpected isBanned is false") } err = enforcer.UnBanned("1", "comment") if err != nil { t.Fatalf("UnBanned() failed: %v", err) } isBanned = enforcer.IsBanned("1", "comment") if isBanned { t.Errorf("unexpected isBanned is false") } }
當然我們對于一個業(yè)務(wù)會有一些較為復(fù)雜的封禁,比如discuss
交流業(yè)務(wù),如果級別為1我們會禁止評論,如果級別為2我們會禁止評論和點贊,級別為3我們會禁止評論、點贊和收藏。
這個時候我們只需要再加上GetBannedLevel()
,在每個業(yè)務(wù)前獲取封禁級別進行判斷就可以簡單的實現(xiàn)了。
利用Go語言封裝功能可以提升封禁操作的效率。通過抽象封禁操作為獨立模塊,提供簡單易用的接口,可以減少代碼重復(fù),提高代碼的可維護性和可擴展性。同時,利用Go語言的并發(fā)特性,可以實現(xiàn)高效的并發(fā)封禁操作,提升系統(tǒng)的處理能力。因此,使用Go語言進行封禁操作是一種高效的選擇。
到此這篇關(guān)于高效封禁:利用Go封裝功能,提升封禁操作效率的文章就介紹到這了,更多相關(guān)用go 封裝一下封禁功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解
Stream?的實現(xiàn)思想就是將數(shù)據(jù)處理流程抽象成了一個數(shù)據(jù)流,每次加工后返回一個新的流供使用。這篇文章主要介紹了Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù),需要的朋友可以參考下2022-01-01golang中import cycle not allowed解決的一種思路
這篇文章主要給大家介紹了關(guān)于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2018-08-08go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析
這篇文章主要為大家介紹了go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪2022-04-04