原文首發於 ISLANDhtml
上一章節咱們留下了一個小尾巴,那就是權限校驗中間件並滅有進行玩啥,那麼今天就對它進行完善。mysql
接上回,如何來判斷用戶是否登陸呢? cookie
就是一個很好的憑證,cookie
會保留到瀏覽器上,每次訪問請求的時候就會攜帶上,後端經過對 cookie
的識別,來判斷用戶是否登陸。git
由此一來,首先咱們是要在登陸的時候保存 cookie
。修改 userHandler
中 UserLogin
代碼github
在判斷密碼正確的時候,對 cookie
進行添加。sql
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
。
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(七):中間件的使用和定義
最新文章都會在公衆號上進行分享,歡迎各位大佬關注