1. 程式人生 > 其它 >中介軟體路由鑑權

中介軟體路由鑑權

中介軟體鑑權 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)