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

簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)

 更新時(shí)間:2023年10月03日 10:07:27   作者:秋玻  
本文將介紹如何使用Go語言封裝二級認(rèn)證功能,實(shí)現(xiàn)簡單高效的用戶認(rèn)證流程,二級認(rèn)證是一種安全措施,要求用戶在登錄后進(jìn)行額外的身份驗(yàn)證,以提高賬戶安全性,

本篇為二級認(rèn)證業(yè)務(wù)篇,會講講二級認(rèn)證業(yè)務(wù)的實(shí)現(xiàn),給庫/框架增加新的功能。

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

在一個(gè)系統(tǒng)中,為了保證賬號安全性,我們除了登錄之外可能還會進(jìn)行二次校驗(yàn),例如游戲中的交易密碼認(rèn)證,博客園登錄的兩步驗(yàn)證等等。因此,我打算為token-go封裝下二級認(rèn)證的功能。

實(shí)現(xiàn)思路

對于二級認(rèn)證我們的認(rèn)證對象是token也就是一個(gè)登錄對象,為了兼容各種業(yè)務(wù)還要加上service業(yè)務(wù),最后就是這個(gè)認(rèn)證生效的時(shí)間time,畢竟總不能一次認(rèn)證過了以后就再也不用認(rèn)證了,那這個(gè)二級認(rèn)證的功能也就沒有意義了。

在業(yè)務(wù)上我們往往需要的四個(gè)方法,執(zhí)行認(rèn)證,判斷是否認(rèn)證,查看認(rèn)證生效的剩余時(shí)間,取消認(rèn)證(讓認(rèn)證失效)。

從代碼實(shí)現(xiàn)上看

認(rèn)證需要存儲token-service信息

判斷是否認(rèn)證有效(是否在認(rèn)證時(shí)間內(nèi))就是去判斷這個(gè)token-service信息是否存在了

查看認(rèn)證生效的剩余時(shí)間就是獲取一下token-service的剩余存儲時(shí)間

取消認(rèn)證(讓認(rèn)證失效)也就是手動去刪除這個(gè)token-service信息了,一般來說在退出登錄的時(shí)候需要取消認(rèn)證信息。

而存儲刪除等持久化操作則使用Adapter

https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer_interface.go#L58

OpenSafe(token string, service string, time int64) error
	IsSafe(token string, service string) bool
	GetSafeTime(token string, service string) int64
	CloseSafe(token string, service string) error

代碼實(shí)現(xiàn)

有了思路后代碼實(shí)現(xiàn)其實(shí)就很簡單了,無非就是存儲信息,判斷信息是否存在和刪除信息了。

執(zhí)行認(rèn)證

https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer.go#L646

首先校驗(yàn)參數(shù),在執(zhí)行認(rèn)證前需要判斷一下是否登錄,不然怎么說是二級認(rèn)證?存儲token和service信息,調(diào)用logger,最后調(diào)用watcher提供擴(kuò)展點(diǎn)。

func (e *Enforcer) OpenSafe(token string, service string, time int64) error {
	if time == 0 {
		return nil
	}
	// 判斷是否登錄
	err := e.CheckLoginByToken(token)
	if err != nil {
		return err
	}
	err = e.adapter.SetStr(e.spliceSecSafeKey(token, service), constant.DefaultSecondAuthValue, time)
	if err != nil {
		return err
	}
	if e.watcher != nil {
		e.watcher.OpenSafe(e.loginType, token, service, time)
	}
	return nil
}

判斷是否認(rèn)證

https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L665

判斷是否認(rèn)證即是判斷token-service信息是否存在。

func (e *Enforcer) IsSafe(token string, service string) bool {
	if token == "" {
		return false
	}
	str := e.adapter.GetStr(e.spliceSecSafeKey(token, service))
	return str != ""
}

查看認(rèn)證生效的剩余時(shí)間

https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L673

func (e *Enforcer) GetSafeTime(token string, service string) int64 {
	if token == "" {
		return 0
	}
	timeout := e.adapter.GetTimeout(e.spliceSecSafeKey(token, service))
	return timeout
}

取消認(rèn)證

https://github.com/weloe/token-go/blob/ac8674dc3ebbd4bcb213328b43f4c11678191919/enforcer.go#L681

取消就是使用adapter刪除token-service的信息

func (e *Enforcer) CloseSafe(token string, service string) error {
	if token == "" {
		return nil
	}
	err := e.adapter.DeleteStr(e.spliceSecSafeKey(token, service))
	if err != nil {
		return err
	}
	if e.watcher != nil {
		e.watcher.CloseSafe(e.loginType, token, service)
	}
	return nil
}

測試

https://github.com/weloe/token-go/blob/9d1a8be2c16559d46460c82b33995b789e6e31c4/enforcer_test.go#L478

func TestEnforcer_SecSafe(t *testing.T) {
	err, enforcer, _ := NewTestEnforcer(t)
	if err != nil {
		t.Fatalf("NewTestEnforcer() failed: %v", err)
	}
	tokenValue, err := enforcer.LoginById("1")
	if err != nil {
		t.Fatalf("LoginById() failed: %v", err)
	}
	service := "default_service"
	err = enforcer.OpenSafe(tokenValue, service, 600000)
	if err != nil {
		t.Fatalf("OpenSafe() failed: %v", err)
	}
	isSafe := enforcer.IsSafe(tokenValue, service)
	if !isSafe {
		t.Fatalf("IsSafe() failed, unexpected return value: %v", isSafe)
	}
	time := enforcer.GetSafeTime(tokenValue, service)
	t.Logf("safe time is %v", time)
	err = enforcer.CloseSafe(tokenValue, service)
	if err != nil {
		t.Fatalf("CloseSafe() failed: %v", err)
	}
	time = enforcer.GetSafeTime(tokenValue, service)
	if time != constant.NotValueExpire {
		t.Fatalf("error safe time: %v", time)
	}
	isSafe = enforcer.IsSafe(tokenValue, service)
	if isSafe {
		t.Fatalf("IsSafe() failed, unexpected return value: %v", isSafe)
	}
}
=== RUN   TestEnforcer_SecSafe
2023/10/02 20:56:00 timer period = 30, timer start
    enforcer_test.go:497: safe time is 600000
--- PASS: TestEnforcer_SecSafe (0.01s)
PASS

通過使用Go語言封裝二級認(rèn)證功能,我們可以實(shí)現(xiàn)簡單高效的用戶認(rèn)證流程。這不僅可以提高賬戶的安全性,還可以簡化我們的代碼,并提高開發(fā)效率。

到此這篇關(guān)于簡單高效!Go語言封裝二級認(rèn)證功能實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)用go 封裝二級認(rèn)證功能內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • golang開啟mod后import報(bào)紅的簡單解決方案

    golang開啟mod后import報(bào)紅的簡單解決方案

    這篇文章主要給大家介紹了關(guān)于golang開啟mod后import報(bào)紅的簡單解決方案,文中通過圖文將解決的辦法介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-01-01
  • Go語言中的函數(shù)詳解

    Go語言中的函數(shù)詳解

    函數(shù)是基本的代碼塊,用于執(zhí)行一個(gè)任務(wù)。本文詳細(xì)講解了Go語言中的函數(shù),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • Go中數(shù)組傳參的幾種方式小結(jié)

    Go中數(shù)組傳參的幾種方式小結(jié)

    本文主要介紹了Go中數(shù)組傳參的幾種方式小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang中日志使用詳解

    Golang中日志使用詳解

    這篇文章記錄了Golang項(xiàng)目中日志使用,以及結(jié)合Gin框架記錄請求日志,文中通過代碼示例介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作有一定的幫助,需要的朋友可以參考下
    2024-01-01
  • Golang拾遺之自定義類型和方法集詳解

    Golang拾遺之自定義類型和方法集詳解

    golang拾遺主要是用來記錄一些遺忘了的、平時(shí)從沒注意過的golang相關(guān)知識。這篇文章主要整理了一下Golang如何自定義類型和方法集,需要的可以參考一下
    2023-02-02
  • Golang之模糊測試工具的使用

    Golang之模糊測試工具的使用

    本文主要介紹了Golang之模糊測試工具的使用,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • 使用golang生成prometheus格式數(shù)據(jù)

    使用golang生成prometheus格式數(shù)據(jù)

    Prometheus是一個(gè)開源的監(jiān)控系統(tǒng),擁有許多Advanced?Feature,本文將介紹Primetheus?client的使用,并基于golang生成prometheus格式數(shù)據(jù),希望對大家有所幫助
    2025-02-02
  • 一文精通管理多版本Go安裝教程

    一文精通管理多版本Go安裝教程

    這篇文章主要為大家介紹了一文精通管理多版本Go安裝教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • go?分布式鎖簡單實(shí)現(xiàn)實(shí)例詳解

    go?分布式鎖簡單實(shí)現(xiàn)實(shí)例詳解

    這篇文章主要為大家介紹了go?分布式鎖簡單實(shí)現(xiàn)實(shí)例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • 深入解析Golang中JSON的編碼與解碼

    深入解析Golang中JSON的編碼與解碼

    隨著互聯(lián)網(wǎng)的快速發(fā)展和數(shù)據(jù)交換的廣泛應(yīng)用,各種數(shù)據(jù)格式的處理成為軟件開發(fā)中的關(guān)鍵問題,本文將介紹?Golang?中?JSON?編碼與解碼的相關(guān)知識,幫助大家了解其基本原理和高效應(yīng)用,需要的可以收藏一下
    2023-05-05

最新評論