原文首發於 ISLAND
上一章節我們留下了一個小尾巴,那就是許可權校驗中介軟體並滅有進行玩啥,那麼今天就對它進行完善。
? Cookies
接上回,如何來判斷使用者是否登入呢? cookie
就是一個很好的憑證,cookie
會保留到瀏覽器上,每次訪問請求的時候就會攜帶上,後端通過對 cookie
的識別,來判斷使用者是否登入。
由此一來,首先我們是要在登入的時候儲存 cookie
。修改 userHandler
中 UserLogin
程式碼
在判斷密碼正確的時候,對 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 資訊
並且有 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
??本章節程式碼
推薦閱讀
Gin(一):Hello
Gin(二):路由Router
Gin(三):模板tmpl
Gin(四):表單提交校驗和模型繫結
Gin(五):連線MySQL
Gin(六):檔案的上傳
Gin(七):中介軟體的使用和定義
個人公眾號
最新文章都會在公眾號上進行分享,歡迎各位大佬關注