欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

高效封禁:利用Go封裝功能,提升封禁操作效率

 更新時(shí)間:2023年10月03日 10:21:56   作者:秋玻  
在網(wǎng)絡(luò)安全領(lǐng)域,封禁操作是一項(xiàng)重要的任務(wù),用于阻止惡意行為和保護(hù)系統(tǒng)安全,而利用Go語言封裝功能可以提升封禁操作的效率,Go語言具有高效的并發(fā)性能和簡(jiǎn)潔的語法,使得開發(fā)者可以快速構(gòu)建高性能的封禁系統(tǒng),

本篇為封禁業(yè)務(wù)篇,會(huì)講講封禁業(yè)務(wù)的實(shí)現(xiàn),給庫/框架增加新的功能。

源碼:https://github.com/weloe/token-go

思路

封禁業(yè)務(wù)也是在一般項(xiàng)目中比較常見的業(yè)務(wù)。我們也將它封裝在庫中作為功能之一。

我們同樣使用adapter作為底層的存儲(chǔ)結(jié)構(gòu),將封禁標(biāo)示作為k-v結(jié)構(gòu)存儲(chǔ)。

把id和服務(wù)名稱service作為key,把封禁的級(jí)別level作為value,以此我們能實(shí)現(xiàn)一些比較常見的封禁業(yè)務(wù)。

實(shí)現(xiàn)

首先就是封禁方法,首先當(dāng)然要校驗(yàn)一下參數(shù),然后存儲(chǔ)封禁標(biāo)識(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
}

再來就是解除封禁的實(shí)現(xiàn),很簡(jiǎn)單,只要?jiǎng)h除我們封禁存的那條記錄就可以了。

https://github.com/weloe/token-go/blob/8bf577c0309332cb42d17e33b435f06fb74d8e7b/enforcer.go#LL412C6-L412C6

// 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
}

接著還需要提供幾個(gè)方便使用的方法

分別用來判斷是否被封禁,獲得封禁的級(jí)別,獲得封禁的剩余時(shí)間三個(gè)方法

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

獲得封禁的級(jí)別

// 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

獲得封禁的剩余時(shí)間

// GetBannedTime get banned time
func (e *Enforcer) GetBannedTime(id string, service string) int64 {
	timeout := e.adapter.GetStrTimeout(e.spliceBannedKey(id, service))
	return timeout
}

有了這幾個(gè)方法,我們就可以使用token-go更為方便是實(shí)現(xiàn)登錄業(yè)務(wù)了。

對(duì)于一般的業(yè)務(wù),我們其實(shí)可以無視封禁級(jí)別。只需要使用Banned()進(jìn)行封禁,在每個(gè)需要校驗(yàn)是否被封禁的業(yè)務(wù)前進(jìn)行IsBanned()的判斷就行了。

測(cè)試?yán)樱?/p>

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")
	}
}

當(dāng)然我們對(duì)于一個(gè)業(yè)務(wù)會(huì)有一些較為復(fù)雜的封禁,比如discuss交流業(yè)務(wù),如果級(jí)別為1我們會(huì)禁止評(píng)論,如果級(jí)別為2我們會(huì)禁止評(píng)論和點(diǎn)贊,級(jí)別為3我們會(huì)禁止評(píng)論、點(diǎn)贊和收藏。

這個(gè)時(shí)候我們只需要再加上GetBannedLevel(),在每個(gè)業(yè)務(wù)前獲取封禁級(jí)別進(jìn)行判斷就可以簡(jiǎn)單的實(shí)現(xiàn)了。

利用Go語言封裝功能可以提升封禁操作的效率。通過抽象封禁操作為獨(dú)立模塊,提供簡(jiǎn)單易用的接口,可以減少代碼重復(fù),提高代碼的可維護(hù)性和可擴(kuò)展性。同時(shí),利用Go語言的并發(fā)特性,可以實(shí)現(xiàn)高效的并發(fā)封禁操作,提升系統(tǒng)的處理能力。因此,使用Go語言進(jìn)行封禁操作是一種高效的選擇。

到此這篇關(guān)于高效封禁:利用Go封裝功能,提升封禁操作效率的文章就介紹到這了,更多相關(guān)用go 封裝一下封禁功能內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 深入解析golang中的標(biāo)準(zhǔn)庫flag

    深入解析golang中的標(biāo)準(zhǔn)庫flag

    Go語言內(nèi)置的flag包實(shí)現(xiàn)了命令行參數(shù)的解析,flag包使得開發(fā)命令行工具更為簡(jiǎn)單,下面通過本文給大家詳細(xì)介紹下golang中的標(biāo)準(zhǔn)庫flag相關(guān)知識(shí),感興趣的朋友一起看看吧
    2021-11-11
  • Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解

    Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù)的思路詳解

    Stream?的實(shí)現(xiàn)思想就是將數(shù)據(jù)處理流程抽象成了一個(gè)數(shù)據(jù)流,每次加工后返回一個(gè)新的流供使用。這篇文章主要介紹了Go?通過?Map/Filter/ForEach?等流式?API?高效處理數(shù)據(jù),需要的朋友可以參考下
    2022-01-01
  • golang中import cycle not allowed解決的一種思路

    golang中import cycle not allowed解決的一種思路

    這篇文章主要給大家介紹了關(guān)于golang中import cycle not allowed解決的一種思路,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-08-08
  • Go語言中多字節(jié)字符的處理方法詳解

    Go語言中多字節(jié)字符的處理方法詳解

    這篇文章主要給大家介紹了關(guān)于Go語言中多字節(jié)字符的處理方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2018-10-10
  • 揭秘Go Json.Unmarshal精度丟失之謎

    揭秘Go Json.Unmarshal精度丟失之謎

    我們知道在json反序列化時(shí)是沒有整型和浮點(diǎn)型的區(qū)別,數(shù)字都使用同一種類型,在go語言的類型中這種共同類型就是float64,下面我們就來探討一下Json.Unmarshal精度丟失之謎吧
    2023-08-08
  • go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析

    這篇文章主要為大家介紹了go語言數(shù)組及結(jié)構(gòu)體繼承和初始化示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪
    2022-04-04
  • go語言中如何使用select的實(shí)現(xiàn)示例

    go語言中如何使用select的實(shí)現(xiàn)示例

    本文主要介紹了go語言中如何使用select的實(shí)現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • 安裝Sublime?Text支持Go插件的方法步驟

    安裝Sublime?Text支持Go插件的方法步驟

    本文主要介紹了安裝Sublime?Text支持Go插件的方法步驟,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-01-01
  • golang os.Eixt使用示例

    golang os.Eixt使用示例

    在Go語言中,os.Exit函數(shù)用于立即終止程序并返回一個(gè)指定的退出狀態(tài)碼,本文就來介紹一下golang os.Eixt使用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-10-10
  • 詳解go中的defer鏈如何被遍歷執(zhí)行

    詳解go中的defer鏈如何被遍歷執(zhí)行

    為了在退出函數(shù)前執(zhí)行一些資源清理的操作,例如關(guān)閉文件、釋放連接、釋放鎖資源等,會(huì)在函數(shù)里寫上多個(gè)defer語句,多個(gè)_defer 結(jié)構(gòu)體形成一個(gè)鏈表,G 結(jié)構(gòu)體中某個(gè)字段指向此鏈表,那么go中的defer鏈如何被遍歷執(zhí)行,本文將給大家詳細(xì)的介紹,感興趣的朋友可以參考下
    2024-01-01

最新評(píng)論