中介軟體路由鑑權
阿新 • • 發佈:2021-11-03
中介軟體鑑權 middlewares/adminAuth.go
package middlewares import ( "18_gin_demo18/models" "encoding/json" "fmt" "github.com/gin-contrib/sessions" "github.com/gin-gonic/gin" "strings" ) //後端管理頁面進行session讀取,進行許可權判斷 func InitAdminAuthMiddleware(c *gin.Context) { //沒有登入的使用者,不能進入使用者管理中心 fmt.Println("進行鑑權中介軟體:InitAdminAuthMiddleware") //進行許可權判斷 沒有登入的使用者 不能進入後臺管理中心 //1、獲取Url訪問的地址 /admin/captcha //2、獲取Session裡面儲存的使用者資訊 //3、判斷Session中的使用者資訊是否存在,如果不存在跳轉到登入頁面(注意需要判斷) 如果存在繼續向下執行 //4、如果Session不存在,判斷當前訪問的URl是否是login doLogin captcha,如果不是跳轉到登入頁面,如果是不行任何操作 // 1、獲取Url訪問的地址 /admin/captcha?t=0.8706946438889653 //去掉get傳值 pathname := strings.Split(c.Request.URL.String(), "?")[0] //fmt.Println("1、獲取Url訪問的地址:", pathname) //2、獲取Session裡面儲存的使用者資訊 //獲取userinfo 對應的session session := sessions.Default(c) userinfo := session.Get("userinfo") //獲取的session中儲存的使用者登入資訊 //型別斷言 來判斷 userinfo是不是一個string userinfoStr, ok := userinfo.(string) //判斷 if ok { //是字串 var userinfoStruct []models.Manager //把字元轉換成結構體(Manager)對應的切片 err := json.Unmarshal([]byte(userinfoStr), &userinfoStruct) //fmt.Println(userinfoStruct) if err != nil || !(len(userinfoStruct) > 0 && userinfoStruct[0].Username != "") { if pathname != "/admin/login" && pathname != "/admin/doLogin" && pathname != "/admin/captcha" { //沒有登入資訊 //排除使用者當前在使用者登入的路由介面 c.JSON(200, gin.H{ "code": 400, "msg": "session不存在,沒有登入資訊,告訴前端返回到登入頁面RedirectUrl", "userinfoStruct": "", "RedirectUrl": "/admin/login", }) } }else{ //有登入資訊 c.JSON(200, gin.H{ //"username":userinfoStruct[0].Username, "code": 200, "msg": "session,存在登入資訊,放行通過", "userinfoStruct": userinfoStruct, "currenturl":pathname, }) } } else { //使用者沒有登入,告訴前端返回到登入頁面 //排除使用者當前在使用者登入的路由介面 if pathname != "/admin/login" && pathname != "/admin/doLogin" && pathname != "/admin/captcha" { c.JSON(200, gin.H{ "code": 400, "msg": "session不存在,沒有登入資訊,告訴前端返回到登入頁面RedirectUrl", "userinfoStruct": "", "RedirectUrl": "/admin/login", }) } } }
路由呼叫中介軟體
adminRouters := r.Group("/admin", middlewares.InitAdminAuthMiddleware) { adminRouters.GET("/", admin.MainController{}.Index) adminRouters.GET("/login", admin.LoginController{}.Index) adminRouters.GET("/captcha", admin.LoginController{}.Captcha) adminRouters.POST("/doLogin", admin.LoginController{}.DoLogin) adminRouters.GET("/loginOut", admin.LoginController{}.LoginOut)