Gin(八):cookie的使用

youngxhui發表於2019-07-26

原文首發於 ISLAND

Gin(八):cookie的使用

上一章節我們留下了一個小尾巴,那就是許可權校驗中介軟體並滅有進行玩啥,那麼今天就對它進行完善。

? Cookies

接上回,如何來判斷使用者是否登入呢? cookie 就是一個很好的憑證,cookie 會保留到瀏覽器上,每次訪問請求的時候就會攜帶上,後端通過對 cookie 的識別,來判斷使用者是否登入。

由此一來,首先我們是要在登入的時候儲存 cookie 。修改 userHandlerUserLogin 程式碼

在判斷密碼正確的時候,對 cookie 進行新增。

context.SetCookie("user_cookie", string(u.Id), 1000, "/", "localhost", false, true)
複製程式碼

這裡來介紹一下這些引數,第一個引數為 cookie 名;第二個引數為 cookie 值;第三個引數為 cookie 有效時長,當 cookie 存在的時間超過設定時間時,cookie 就會失效,它就不再是我們有效的 cookie;第四個引數為 cookie 所在的目錄;第五個為所在域,表示我們的 cookie 作用範圍;第六個表示是否只能通過 https 訪問;第七個表示 cookie 是否可以通過 js程式碼進行操作。

啟動我們的專案,進行登入操作,F12 開啟我們的控制檯,選擇Application ,在側邊欄找到 cookie,並且選擇我們的站點,此時就可以在我們的右側看到我們剛剛設定的 cookie 資訊

檢視cookie

並且有 Expires/Max-Age 屬性,該屬性表示 cookie 的過期時間,一旦超過這個時間,cookie 就會自動消失。

此時,已經表明我們的 cookie 設定成功。

?通過中介軟體獲取Cookie

既然 cookie 已經獲取成功,那麼就該對我們新寫的 Auth 中介軟體進行修改了。

我們首先建立一個 401.tmpl 檔案,用於展示我們的許可權不足時的資訊。

{{template "header"}}

{{template "nav"}}

請先登入:<a href="/">首頁</a>
複製程式碼

當我們要訪問需要許可權的路由時,恰巧我們許可權不足,就會轉跳到該頁面。

此時再完善我們的中介軟體。

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		_, e := context.Request.Cookie("user_cookie")
		if e == nil {
			context.Next()
		} else {
			context.Abort()
			context.HTML(http.StatusUnauthorized, "401.tmpl", nil)
		}

	}
}
複製程式碼

在這裡我們通過 context.Request.Cookie() 來獲取指定的 cookie 。這裡還有一個函式 context.Abort()表示對當前的請求進行中止。

重新啟動專案,直接去訪問 http://localhost:8080/user/profile/?id=5,會出現我們的401 頁面。當我們登入後再進行訪問,就可以正常訪問。

此時此刻說明我們的 auth 中介軟體起到了作用。

?重新整理 cookie

在上面的 cookie 設定中有一個引數是為了設定過期時間,那麼過期時間到底設定多長呢?過期時間設定過長,那麼可能留下安全隱患,如果設定過短,又給使用者帶來不方便。

所以我們要在 cookie 請求成功的時候自動重新整理我們的 cookie 時間。

修改我們中介軟體程式碼。

首先是獲取到原來的 cookie ,然後就是重新設定一個 cookie

func Auth() gin.HandlerFunc {
	return func(context *gin.Context) {
		cookie, e := context.Request.Cookie("user_cookie")
		if e == nil {
			context.SetCookie(cookie.Name, cookie.Value, 1000, cookie.Path, cookie.Domain, cookie.Secure, cookie.HttpOnly)
			context.Next()
		} else {
			context.Abort()
			context.HTML(http.StatusUnauthorized, "401.tmpl", nil)
		}
	}
}
複製程式碼

重新啟動我們的專案,仍舊是開啟我們專案的控制檯,每次訪問需要許可權的介面時,都會看到cookie的過期時間在重新重新整理。

✍總結

本章節主要講述了 cookie 如何新增,如何獲取,又如何通過中介軟體來校驗 cookie 和重新整理 cookie

?‍?本章節程式碼

Github

推薦閱讀

Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表單提交校驗和模型繫結
Gin(五):連線MySQL
Gin(六):檔案的上傳
Gin(七):中介軟體的使用和定義

個人公眾號

最新文章都會在公眾號上進行分享,歡迎各位大佬關注

Gin(八):cookie的使用

相關文章