0


go实战全家桶优化goweb实现权限控制

GO全家桶

UML

开源

water/goweb

控制端

type IrpcCheckAllowed interface {
// 测试开关、是否检查权限,方便测试可以关闭
IfCheckRes() bool
IfCheckSession() bool

  1. // 根据token获取useid的实现
  2. RpcUserIdGetBySession(ctx *gin.Context, token string) (*webdto.WebUserId, error)
  3. // RPC 设置ctx上下文的CooUserID信息的实现
  4. RpcSetUserId(c *gin.Context) //set *webdto.WebUserId
  5. // RPC 获取ctx上下文的CooUserID信息的 实现
  6. RpcGetUserId(ctx *gin.Context) *webdto.WebUserId
  7. //rpc 检查权限的实现
  8. RpcCheckAllowed(ctx context.Context, req *webdto.WebCheckRequest) (*webdto.WebCheckResult, error)

}

应用端

  1. // 应用服务上下文获取信息
  2. type IwebCheckAllowed interface {
  3. SetUserId(c *gin.Context)
  4. GetUserId(ctx *gin.Context) *webdto.WebUserId
  5. CheckToken(c *gin.Context) (int, error)
  6. GetSessionToken(c *gin.Context) (int, *webdto.WebUserId, error)
  7. WebCheckAllowed(c *gin.Context)
  8. }

内部WEBSERVER无权限控制

  1. /*
  2. @Title 文件名称: main.go
  3. @Description 描述: 有芯通用索引微服务
  4. @Contact.user raymond
  5. @Author 作者: leijianming@163.com 时间(2024-02-18 22:38:21)
  6. @Update 作者: leijianming@163.com 时间(2024-02-18 22:38:21)
  7. */
  8. func InjectMiddleware() {
  9. // 注册业务权限rpc接口,FindBeanRpcNocheckRight这个不鉴权,鉴权的rpc在general-common业务服务使用
  10. webcheck.FindBeanWebCheckRight().RegisterIrpc(webcustom.FindBeanRpcNocheckRight())
  11. // 注入业务中间件(webmiddleware.DemoWebMiddleWare())样例,只是打日志
  12. //webcheck.FindBeanWebCheckRight().RegisterMiddlewares(handlerfunc.WebExampleMiddleware())
  13. }
  14. // https://www.jianshu.com/p/982c4fabb11d swagg参数
  15. func StartWeb() {
  16. defer func() {
  17. if r := recover(); r != nil {
  18. goutils.Error("[main] Recovered Error in:", r)
  19. fmt.Println("[main] Recovered Error in:", r)
  20. buf := make([]byte, 4096)
  21. n := runtime.Stack(buf, false)
  22. fmt.Println(string(buf[:n]))
  23. goutils.Error(string(buf[:n]))
  24. }
  25. }()
  26. InjectMiddleware()
  27. goutils.Info("now starting serverNats....")
  28. goperfstat.FindBeanGoperfStat().SetEnable2Out(false)
  29. goperfstat.FindBeanGoperfStat().StartStats()
  30. var config = ichubconfig.FindBeanIchubConfig()
  31. serverDto := config.ReadIchubWebServer()
  32. goutils.Info("serverDto=", serverDto)
  33. var server = webserver.New(serverDto)
  34. var swagger = config.ReadWebSwagger()
  35. //注册服务
  36. goutils.Info("swagger is http://" + swagger.Host + "/swagger/index.html#/")
  37. fmt.Println("serverName ", serverDto.ServerName)
  38. server.StartWebSwagger(router.Swagger, router.Register)
  39. }

有权限控制

  1. package webstart
  2. import (
  3. "fmt"
  4. "gitee.com/leijmdas/gobase/goconfig/common/golog"
  5. "gitee.com/leijmdas/gobase/goconfig/common/ichubconfig"
  6. "gitee.com/leijmdas/goplatform/api/goauth/authproxy"
  7. "gitee.com/leijmdas/goplatform/web/server/router"
  8. "gitee.com/leijmdas/goweb/common/webright/webcheck"
  9. "gitee.com/leijmdas/goweb/common/webright/webmiddleware/handlerfunc"
  10. "gitee.com/leijmdas/goweb/common/webserver"
  11. "gitee.com/leijmdas/goweb/domain/service"
  12. "github.com/sirupsen/logrus"
  13. "runtime"
  14. )
  15. /*
  16. @Title 文件名称: websample.go
  17. @Description 描述: 通用引擎微服务
  18. @Contact.user raymond
  19. @Author 作者: leijianming@163.com 时间(2024-02-18 22:38:21)
  20. @Update 作者: leijianming@163.com 时间(2024-02-18 22:38:21)
  21. */
  22. // https://www.jianshu.com/p/982c4fabb11d swagg参数
  23. func InjectMiddleware() {
  24. // 注册业务权限rpc接口,FindBeanRpcNocheckRight这个不鉴权,鉴权的rpc在general-common业务服务使用
  25. //webcheck.FindBeanWebCheckRight().RegisterIrpc(webcustom.FindBeanRpcCheckRight())
  26. webcheck.FindBeanWebCheckRight().RegisterIrpc(authproxy.FindBeanAuthProxy())
  27. // 注入业务中间件(webmiddleware.DemoWebMiddleWare())样例,只是打日志
  28. webcheck.FindBeanWebCheckRight().RegisterMiddlewares(handlerfunc.WebExampleMiddleware())
  29. }
  30. func StartWeb() {
  31. defer func() {
  32. if r := recover(); r != nil {
  33. golog.Error("[main] Recovered Error in:", r)
  34. fmt.Println("[main] Recovered Error in:", r)
  35. buf := make([]byte, 4096)
  36. n := runtime.Stack(buf, false)
  37. //fmt.Println(string(buf[:n]))
  38. golog.Error(string(buf[:n]))
  39. }
  40. }()
  41. InjectMiddleware()
  42. service.Init()
  43. var config = ichubconfig.FindBeanIchubConfig()
  44. serverDto := config.ReadWebServer()
  45. golog.Info("serverDto=", serverDto)
  46. var server = webserver.New(serverDto)
  47. logrus.Info("http://localhost:88/swagger/index.html#/")
  48. //注册服务
  49. server.StartWebSwagger(router.Swagger, router.Register)
  50. }
  51. // go get -u -v github.com/swaggo/gin-swagger//go get -u -v github.com/swaggo/files
  52. // go get -u -v github.com/alecthomas/template

控制端实现

  1. package authproxy
  2. import (
  3. "context"
  4. "errors"
  5. "gitee.com/leijmdas/gobase/goconfig/common/base/goutils"
  6. "gitee.com/leijmdas/gobase/goconfig/common/golog"
  7. "gitee.com/leijmdas/goplatform/api/goauth"
  8. "gitee.com/leijmdas/goweb/common/webright/webcheck/webcustom"
  9. "gitee.com/leijmdas/goweb/common/webright/webconsts"
  10. "gitee.com/leijmdas/goweb/common/webright/webdto"
  11. "github.com/gin-gonic/gin"
  12. )
  13. type AuthProxy struct {
  14. *webcustom.RpcCheckRight
  15. }
  16. func NewAuthProxy() *AuthProxy {
  17. return &AuthProxy{
  18. RpcCheckRight: webcustom.NewRpcCheckRight(),
  19. }
  20. }
  21. func (r AuthProxy) RpcUserIdGetBySession(c *gin.Context, token string) (*webdto.WebUserId, error) {
  22. var apiUserResult = goauth.FindBeanauthApiService().Auth(token)
  23. if !apiUserResult.IsSuccess() {
  24. return nil, errors.New(apiUserResult.Msg)
  25. }
  26. var webuser = webdto.NewWebUserId()
  27. webuser.ApiUserResult = apiUserResult.Data
  28. return webuser, nil
  29. }
  30. func (r AuthProxy) RpcSetUserId(c *gin.Context) {
  31. token := c.GetHeader(webconsts.AccessToken)
  32. if token == "" {
  33. goutils.Error("toke is empty!")
  34. return
  35. }
  36. var webuser, err = r.RpcUserIdGetBySession(c, token)
  37. if err != nil {
  38. golog.Error(err)
  39. return
  40. }
  41. webdto.SetUserId(c, webuser)
  42. }
  43. func (r AuthProxy) RpcGetUserId(c *gin.Context) *webdto.WebUserId {
  44. return webdto.GetUserId(c)
  45. }
  46. func (r AuthProxy) RpcCheckAllowed(c context.Context, req *webdto.WebCheckRequest) (*webdto.WebCheckResult, error) {
  47. token := c.(*gin.Context).GetHeader(webconsts.AccessToken)
  48. if token == "" {
  49. goutils.Error("toke is empty!")
  50. return nil, errors.New("token is empty")
  51. }
  52. var webuser, err = r.RpcUserIdGetBySession(c.(*gin.Context), token)
  53. if err != nil {
  54. golog.Error(err)
  55. return nil, err
  56. }
  57. // 还要增加接口权限 判断url是否有权限
  58. var result = webdto.NewWebCheckResult()
  59. result.Allowed = true
  60. result.ApiUserResult = webuser.ApiUserResult
  61. return result, nil
  62. }
  63. func (r AuthProxy) IfCheckRes() bool {
  64. return true
  65. }
  66. func (self *AuthProxy) IfCheckSession() bool {
  67. return true
  68. }

注入业务中间件

  1. // 注入业务中间件(webmiddleware.DemoWebMiddleWare())样例,只是打日志
  2. webcheck.FindBeanWebCheckRight().RegisterMiddlewares(handlerfunc.WebExampleMiddleware())

  1. func (this *WebRouters) InstallMiddleWare(router *gin.Engine) *gin.Engine {
  2. router.Use(webmiddlewares.CheckSessionToken(), webmiddlewares.CheckAllowed())
  3. router.Use(webmiddlewares.WebMiddleware()...)
  4. //router.Use(gin.)
  5. router.Use(middleware.RequestID(), middleware.Context(), gin.Recovery(), middleware.Cors())
  6. //router.Use(gin.Logger(),gindump.Dump())
  7. router.Use(gzip.Gzip(gzip.DefaultCompression))
  8. this.AddRouter(router)
  9. return router
  10. }

本文转载自: https://blog.csdn.net/leijmdas/article/details/142329911
版权归原作者 leijmdas 所有, 如有侵权,请联系我们删除。

“go实战全家桶优化goweb实现权限控制”的评论:

还没有评论