refactor(app):基本完成基础服务框架的功能构建。

This commit is contained in:
徐涛
2022-09-28 16:01:16 +08:00
parent df9bf83bb8
commit 4b08952916
9 changed files with 334 additions and 152 deletions

View File

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