electricity_bill_calc_service/security/security.go

72 lines
2.8 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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()
}