package security import ( "electricity_bill_calc/cache" "electricity_bill_calc/model" "electricity_bill_calc/response" "strings" "github.com/gofiber/fiber/v2" ) // 用于解析Authorization头,并从缓存中获取用户会话信息注入上下文的中间件。 // 如果没有获取到用户会话信息,将直接跳过会话信息注入。 // ! 仅通过该中间件是不能保证上下文中一定保存有用户会话信息的。 func SessionRecovery(c *fiber.Ctx) error { if auth := c.Get("Authorization", ""); len(auth) > 0 { token := strings.Fields(auth)[1] session, err := cache.RetreiveSession(token) if err == nil && session != nil { c.Locals("session", session) } } return c.Next() } // 用于强制确定用户已经登录了系统,即具有有效的用户会话 // ! 通过该中间件以后,是可以保证上下文中一定具有用户会话信息的。 func MustAuthenticated(c *fiber.Ctx) error { if session, ok := c.Locals("session").(*model.Session); !ok || session == nil { return response.NewResult(c).Forbidden("用户必须在登录以后才能访问系统。") } return c.Next() } // 用于对用户会话进行是否企业用户的判断 // ! 通过该中间件以后,是可以保证上下文中一定具有用户会话信息的。 func EnterpriseAuthorize(c *fiber.Ctx) error { if sess, ok := c.Locals("session").(*model.Session); !ok || sess.Type != model.USER_TYPE_ENT { return response.NewResult(c).Forbidden("指定接口资源只限企业用户访问。") } return c.Next() } // 用于对用户会话进行是否监管用户或运维用户的判断 // ! 通过该中间件以后,是可以保证上下文中一定具有用户会话信息的。 func ManagementAuthorize(c *fiber.Ctx) error { if sess, ok := c.Locals("session").(*model.Session); !ok || (sess.Type != model.USER_TYPE_SUP && sess.Type != model.USER_TYPE_OPS) { r := response.NewResult(c) return r.Forbidden("指定接口资源只限市场监管用户访问。") } return c.Next() } // 用于对用户会话进行是否运维用户的判断 // ! 通过该中间件以后,是可以保证上下文中一定具有用户会话信息的。 func OPSAuthorize(c *fiber.Ctx) error { if sess, ok := c.Locals("session").(*model.Session); !ok || sess.Type != model.USER_TYPE_OPS { return response.NewResult(c).Forbidden("指定接口资源只限系统运维用户访问。") } return c.Next() } // 用于对用户会话进行是否核心运维用户的判断 // ! 通过该中间件以后,是可以保证上下文中一定具有用户会话信息的。 func SingularityAuthorize(c *fiber.Ctx) error { if sess, ok := c.Locals("session").(*model.Session); !ok || sess.Type != model.USER_TYPE_OPS || sess.Uid != "000" { return response.NewResult(c).Forbidden("指定接口资源只限系统核心运维用户访问。") } return c.Next() }