Просмотр исходного кода

token拦截处理,权限判断

yxh 4 лет назад
Родитель
Сommit
ca7e9170a3

+ 0 - 2
internal/app/common/controller/base.go

@@ -8,7 +8,6 @@
 package controller
 
 import (
-	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
 )
 
@@ -17,5 +16,4 @@ type BaseController struct {
 
 // Init 自动执行的初始化方法
 func (c *BaseController) Init(r *ghttp.Request) {
-	g.Log().Debug(r.GetCtx(), "BaseController.Init")
 }

+ 2 - 2
internal/app/common/router/router.go

@@ -10,12 +10,12 @@ package router
 import (
 	"github.com/gogf/gf/v2/net/ghttp"
 	"github.com/tiger1103/gfast/v3/internal/app/common/controller"
-	"github.com/tiger1103/gfast/v3/library/libMiddleware"
+	commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
 )
 
 func BindController(group *ghttp.RouterGroup) {
 	group.Group("/pub", func(group *ghttp.RouterGroup) {
-		group.Middleware(libMiddleware.MiddlewareCORS)
+		group.Middleware(commonService.Middleware().MiddlewareCORS)
 		group.Group("/captcha", func(group *ghttp.RouterGroup) {
 			group.Bind(
 				controller.Captcha,

+ 30 - 0
internal/app/common/service/middleware.go

@@ -0,0 +1,30 @@
+/*
+* @desc:中间件处理
+* @company:云南奇讯科技有限公司
+* @Author: yixiaohu<yxh669@qq.com>
+* @Date:   2022/3/17 9:11
+ */
+
+package service
+
+import "github.com/gogf/gf/v2/net/ghttp"
+
+type IMiddleware interface {
+	MiddlewareCORS(r *ghttp.Request)
+}
+
+type middlewareImpl struct{}
+
+var middleService = middlewareImpl{}
+
+func Middleware() IMiddleware {
+	return IMiddleware(&middleService)
+}
+
+func (s *middlewareImpl) MiddlewareCORS(r *ghttp.Request) {
+	corsOptions := r.Response.DefaultCORSOptions()
+	// you can set options
+	//corsOptions.AllowDomain = []string{"goframe.org", "baidu.com"}
+	r.Response.CORS(corsOptions)
+	r.Middleware.Next()
+}

+ 2 - 2
internal/app/demo/router/router.go

@@ -9,13 +9,13 @@ package router
 
 import (
 	"github.com/gogf/gf/v2/net/ghttp"
+	commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
 	"github.com/tiger1103/gfast/v3/internal/app/demo/controller"
-	"github.com/tiger1103/gfast/v3/library/libMiddleware"
 )
 
 func BindController(group *ghttp.RouterGroup) {
 	group.Group("/demo", func(group *ghttp.RouterGroup) {
-		group.Middleware(libMiddleware.MiddlewareCORS)
+		group.Middleware(commonService.Middleware().MiddlewareCORS)
 		group.Bind(
 			controller.Demo,
 		)

+ 0 - 36
internal/app/system/controller/base.go

@@ -8,14 +8,8 @@
 package controller
 
 import (
-	"github.com/gogf/gf/v2/frame/g"
 	"github.com/gogf/gf/v2/net/ghttp"
-	"github.com/gogf/gf/v2/util/gconv"
-	"github.com/tiger1103/gfast-token/gftoken"
 	commonController "github.com/tiger1103/gfast/v3/internal/app/common/controller"
-	"github.com/tiger1103/gfast/v3/internal/app/system/model"
-	"github.com/tiger1103/gfast/v3/internal/app/system/service"
-	"github.com/tiger1103/gfast/v3/library/libResponse"
 )
 
 type baseController struct {
@@ -25,34 +19,4 @@ type baseController struct {
 // Init 自动执行的初始化方法
 func (c *baseController) Init(r *ghttp.Request) {
 	c.BaseController.Init(r)
-	b, failed := c.setLoginUser(r)
-	if !b {
-		libResponse.JsonExit(r, failed.Code, failed.Message)
-	}
-}
-
-//判断登录并设置用户信息
-func (c *baseController) setLoginUser(r *ghttp.Request) (b bool, failed *gftoken.AuthFailed) {
-	ctx := r.GetCtx()
-	b = true
-	// 验证用户是否登录
-	b, failed = service.GfToken(ctx).IsLogin(r)
-	if !b {
-		return
-	}
-	// 初始化登录用户信息
-	data, err := service.GfToken(ctx).ParseToken(r)
-	if err != nil {
-		return
-	}
-	if data != nil {
-		context := new(model.Context)
-		err = gconv.Struct(data.Data, &context.User)
-		if err != nil {
-			g.Log().Error(ctx, err)
-			return
-		}
-		service.Context().Init(r, context)
-	}
-	return
 }

+ 7 - 2
internal/app/system/router/router.go

@@ -9,13 +9,18 @@ package router
 
 import (
 	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/os/gctx"
+	commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
 	"github.com/tiger1103/gfast/v3/internal/app/system/controller"
-	"github.com/tiger1103/gfast/v3/library/libMiddleware"
+	"github.com/tiger1103/gfast/v3/internal/app/system/service"
 )
 
 func BindController(group *ghttp.RouterGroup) {
 	group.Group("/system", func(group *ghttp.RouterGroup) {
-		group.Middleware(libMiddleware.MiddlewareCORS)
+		group.Middleware(commonService.Middleware().MiddlewareCORS)
+		//context拦截器
+		group.Middleware(service.Middleware().Ctx, service.Middleware().Auth)
+		service.GfToken(gctx.New()).Middleware(group)
 		group.Bind(
 			controller.User,
 		)

+ 5 - 1
internal/app/system/service/context.go

@@ -64,5 +64,9 @@ func (s *contextServiceImpl) GetLoginUser(ctx context.Context) *model.ContextUse
 
 // GetUserId 获取当前登录用户id
 func (s *contextServiceImpl) GetUserId(ctx context.Context) uint64 {
-	return s.GetLoginUser(ctx).Id
+	user := s.GetLoginUser(ctx)
+	if user != nil {
+		return user.Id
+	}
+	return 0
 }

+ 134 - 0
internal/app/system/service/middleware.go

@@ -0,0 +1,134 @@
+/*
+* @desc:中间件
+* @company:云南奇讯科技有限公司
+* @Author: yixiaohu<yxh669@qq.com>
+* @Date:   2022/3/17 9:17
+ */
+
+package service
+
+import (
+	"github.com/gogf/gf/v2/frame/g"
+	"github.com/gogf/gf/v2/net/ghttp"
+	"github.com/gogf/gf/v2/text/gstr"
+	"github.com/gogf/gf/v2/util/gconv"
+	commonService "github.com/tiger1103/gfast/v3/internal/app/common/service"
+	"github.com/tiger1103/gfast/v3/internal/app/system/model"
+	"github.com/tiger1103/gfast/v3/library/libResponse"
+)
+
+type IMiddleware interface {
+	Ctx(r *ghttp.Request)
+	Auth(r *ghttp.Request)
+}
+
+type middlewareImpl struct{}
+
+var middleService = middlewareImpl{}
+
+func Middleware() IMiddleware {
+	return IMiddleware(&middleService)
+}
+
+// Ctx 自定义上下文对象
+func (s *middlewareImpl) Ctx(r *ghttp.Request) {
+	ctx := r.GetCtx()
+	// 初始化登录用户信息
+	data, err := GfToken(ctx).ParseToken(r)
+	if err != nil {
+		// 执行下一步请求逻辑
+		r.Middleware.Next()
+	}
+	if data != nil {
+		context := new(model.Context)
+		err = gconv.Struct(data.Data, &context.User)
+		if err != nil {
+			g.Log().Error(ctx, err)
+			// 执行下一步请求逻辑
+			r.Middleware.Next()
+		}
+		Context().Init(r, context)
+	}
+	// 执行下一步请求逻辑
+	r.Middleware.Next()
+}
+
+// Auth 权限判断处理中间件
+func (s *middlewareImpl) Auth(r *ghttp.Request) {
+	ctx := r.GetCtx()
+	//获取登陆用户id
+	adminId := Context().GetUserId(ctx)
+	/*if r.Method != "GET" && adminId!=1{
+		library.FailJson(true, r, "演示系统,您没有操作权限!")
+	}*/
+	accessParams := r.Get("accessParams").Strings()
+	accessParamsStr := ""
+	if len(accessParams) > 0 && accessParams[0] != "undefined" {
+		accessParamsStr = "?" + gstr.Join(accessParams, "&")
+	}
+	//获取无需验证权限的用户id
+	tagSuperAdmin := false
+	User().NotCheckAuthAdminIds(ctx).Iterator(func(v interface{}) bool {
+		if gconv.Uint64(v) == adminId {
+			tagSuperAdmin = true
+			return false
+		}
+		return true
+	})
+	if tagSuperAdmin {
+		r.Middleware.Next()
+		//不要再往后面执行
+		return
+	}
+	url := gstr.TrimLeft(r.Request.URL.Path, "/") + accessParamsStr
+	//获取地址对应的菜单id
+	menuList, err := Rule().GetIsMenuStatusList(ctx)
+	if err != nil {
+		g.Log().Error(ctx, err)
+		libResponse.FailJson(true, r, "请求数据失败")
+	}
+	var menu *model.SysAuthRuleInfoRes
+	for _, m := range menuList {
+		ms := gstr.SubStr(m.Name, 0, gstr.Pos(m.Name, "?"))
+		if m.Name == url || ms == url {
+			menu = m
+			break
+		}
+	}
+	//只验证存在数据库中的规则
+	if menu != nil {
+		//若存在不需要验证的条件则跳过
+		if gstr.Equal(menu.Condition, "nocheck") {
+			r.Middleware.Next()
+			return
+		}
+		menuId := menu.Id
+		//菜单没存数据库不验证权限
+		if menuId != 0 {
+			//判断权限操作
+			enforcer, err := commonService.CasbinEnforcer(ctx)
+			if err != nil {
+				g.Log().Error(ctx, err)
+				libResponse.FailJson(true, r, "获取权限失败")
+			}
+			groupPolicy := enforcer.GetFilteredGroupingPolicy(0,
+				gconv.String(adminId))
+			if len(groupPolicy) == 0 {
+				libResponse.FailJson(true, r, "没有访问权限")
+			}
+			hasAccess := false
+			for _, v := range groupPolicy {
+				if enforcer.HasPolicy(v[1], gconv.String(menuId), "All") {
+					hasAccess = true
+					break
+				}
+			}
+			if !hasAccess {
+				libResponse.FailJson(true, r, "没有访问权限")
+			}
+		}
+	} else if menu == nil && accessParamsStr != "" {
+		libResponse.FailJson(true, r, "没有访问权限")
+	}
+	r.Middleware.Next()
+}

+ 0 - 20
library/libMiddleware/middleware.go

@@ -1,20 +0,0 @@
-/*
-* @desc:公用中间件
-* @company:云南奇讯科技有限公司
-* @Author: yixiaohu
-* @Date:   2022/3/2 15:16
- */
-
-package libMiddleware
-
-import (
-	"github.com/gogf/gf/v2/net/ghttp"
-)
-
-func MiddlewareCORS(r *ghttp.Request) {
-	corsOptions := r.Response.DefaultCORSOptions()
-	// you can set options
-	//corsOptions.AllowDomain = []string{"goframe.org", "baidu.com"}
-	r.Response.CORS(corsOptions)
-	r.Middleware.Next()
-}