首页 > 其他分享 >go实战全家桶优化goweb实现权限控制

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

时间:2024-09-18 12:21:24浏览次数:12  
标签:func goweb Context router go gin 权限 com webdto

UML

开源

water/goweb

控制端


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

    // 根据token获取useid的实现
    RpcUserIdGetBySession(ctx *gin.Context, token string) (*webdto.WebUserId, error)

    // RPC 设置ctx上下文的CooUserID信息的实现
    RpcSetUserId(c *gin.Context) //set *webdto.WebUserId

    // RPC 获取ctx上下文的CooUserID信息的 实现
    RpcGetUserId(ctx *gin.Context) *webdto.WebUserId

    //rpc 检查权限的实现
    RpcCheckAllowed(ctx context.Context, req *webdto.WebCheckRequest) (*webdto.WebCheckResult, error)
}应用

应用端

// 应用服务上下文获取信息
type IwebCheckAllowed interface {
    SetUserId(c *gin.Context)

    GetUserId(ctx *gin.Context) *webdto.WebUserId

    CheckToken(c *gin.Context) (int, error)

    GetSessionToken(c *gin.Context) (int, *webdto.WebUserId, error)

    WebCheckAllowed(c *gin.Context)
}

内部WEBSERVER无权限控制

/*
@Title    文件名称: main.go
@Description  描述: 有芯通用索引微服务
@Contact.user raymond
@Author  作者: [email protected]  时间(2024-02-18 22:38:21)
@Update  作者: [email protected]  时间(2024-02-18 22:38:21)
*/
func InjectMiddleware() {

    // 注册业务权限rpc接口,FindBeanRpcNocheckRight这个不鉴权,鉴权的rpc在general-common业务服务使用
    webcheck.FindBeanWebCheckRight().RegisterIrpc(webcustom.FindBeanRpcNocheckRight())
    // 注入业务中间件(webmiddleware.DemoWebMiddleWare())样例,只是打日志
    //webcheck.FindBeanWebCheckRight().RegisterMiddlewares(handlerfunc.WebExampleMiddleware())

}

// https://www.jianshu.com/p/982c4fabb11d swagg参数

func StartWeb() {
    defer func() {
       if r := recover(); r != nil {
          goutils.Error("[main] Recovered  Error in:", r)
          fmt.Println("[main] Recovered Error in:", r)
          buf := make([]byte, 4096)
          n := runtime.Stack(buf, false)
          fmt.Println(string(buf[:n]))
          goutils.Error(string(buf[:n]))

       }
    }()
    InjectMiddleware()

    goutils.Info("now starting serverNats....")
    goperfstat.FindBeanGoperfStat().SetEnable2Out(false)
    goperfstat.FindBeanGoperfStat().StartStats()

    var config = ichubconfig.FindBeanIchubConfig()
    serverDto := config.ReadIchubWebServer()
    goutils.Info("serverDto=", serverDto)
    var server = webserver.New(serverDto)

    var swagger = config.ReadWebSwagger()
    //注册服务
    goutils.Info("swagger is http://" + swagger.Host + "/swagger/index.html#/")
    fmt.Println("serverName ", serverDto.ServerName)

    server.StartWebSwagger(router.Swagger, router.Register)

}

有权限控制

package webstart

import (
    "fmt"
    "gitee.com/leijmdas/gobase/goconfig/common/golog"
    "gitee.com/leijmdas/gobase/goconfig/common/ichubconfig"
    "gitee.com/leijmdas/goplatform/api/goauth/authproxy"
    "gitee.com/leijmdas/goplatform/web/server/router"
    "gitee.com/leijmdas/goweb/common/webright/webcheck"
    "gitee.com/leijmdas/goweb/common/webright/webmiddleware/handlerfunc"
    "gitee.com/leijmdas/goweb/common/webserver"
    "gitee.com/leijmdas/goweb/domain/service"
    "github.com/sirupsen/logrus"
    "runtime"
)

/*
    @Title    文件名称: websample.go
    @Description  描述: 通用引擎微服务
    @Contact.user raymond
    @Author  作者: [email protected]  时间(2024-02-18 22:38:21)
    @Update  作者: [email protected]  时间(2024-02-18 22:38:21)
*/

// https://www.jianshu.com/p/982c4fabb11d swagg参数
func InjectMiddleware() {

    // 注册业务权限rpc接口,FindBeanRpcNocheckRight这个不鉴权,鉴权的rpc在general-common业务服务使用
    //webcheck.FindBeanWebCheckRight().RegisterIrpc(webcustom.FindBeanRpcCheckRight())
    webcheck.FindBeanWebCheckRight().RegisterIrpc(authproxy.FindBeanAuthProxy())
    // 注入业务中间件(webmiddleware.DemoWebMiddleWare())样例,只是打日志
    webcheck.FindBeanWebCheckRight().RegisterMiddlewares(handlerfunc.WebExampleMiddleware())

}
func StartWeb() {
    defer func() {
       if r := recover(); r != nil {
          golog.Error("[main] Recovered  Error in:", r)
          fmt.Println("[main] Recovered Error in:", r)
          buf := make([]byte, 4096)
          n := runtime.Stack(buf, false)
          //fmt.Println(string(buf[:n]))
          golog.Error(string(buf[:n]))

       }
    }()
    InjectMiddleware()
    service.Init()

    var config = ichubconfig.FindBeanIchubConfig()
    serverDto := config.ReadWebServer()

    golog.Info("serverDto=", serverDto)
    var server = webserver.New(serverDto)
    logrus.Info("http://localhost:88/swagger/index.html#/")
    //注册服务

    server.StartWebSwagger(router.Swagger, router.Register)

}

// go get -u -v github.com/swaggo/gin-swagger//go get -u -v github.com/swaggo/files
// go get -u -v github.com/alecthomas/template

控制端实现

package authproxy

import (
    "context"
    "errors"
    "gitee.com/leijmdas/gobase/goconfig/common/base/goutils"
    "gitee.com/leijmdas/gobase/goconfig/common/golog"
    "gitee.com/leijmdas/goplatform/api/goauth"
    "gitee.com/leijmdas/goweb/common/webright/webcheck/webcustom"
    "gitee.com/leijmdas/goweb/common/webright/webconsts"
    "gitee.com/leijmdas/goweb/common/webright/webdto"
    "github.com/gin-gonic/gin"
)

type AuthProxy struct {
    *webcustom.RpcCheckRight
}

func NewAuthProxy() *AuthProxy {
    return &AuthProxy{
       RpcCheckRight: webcustom.NewRpcCheckRight(),
    }
}

func (r AuthProxy) RpcUserIdGetBySession(c *gin.Context, token string) (*webdto.WebUserId, error) {
    var apiUserResult = goauth.FindBeanauthApiService().Auth(token)
    if !apiUserResult.IsSuccess() {
       return nil, errors.New(apiUserResult.Msg)
    }

    var webuser = webdto.NewWebUserId()
    webuser.ApiUserResult = apiUserResult.Data
    return webuser, nil
}

func (r AuthProxy) RpcSetUserId(c *gin.Context) {

    token := c.GetHeader(webconsts.AccessToken)
    if token == "" {
       goutils.Error("toke is empty!")
       return
    }
    var webuser, err = r.RpcUserIdGetBySession(c, token)
    if err != nil {
       golog.Error(err)
       return
    }
    webdto.SetUserId(c, webuser)
}

func (r AuthProxy) RpcGetUserId(c *gin.Context) *webdto.WebUserId {

    return webdto.GetUserId(c)
}

func (r AuthProxy) RpcCheckAllowed(c context.Context, req *webdto.WebCheckRequest) (*webdto.WebCheckResult, error) {
    token := c.(*gin.Context).GetHeader(webconsts.AccessToken)
    if token == "" {
       goutils.Error("toke is empty!")
       return nil, errors.New("token is empty")
    }
    var webuser, err = r.RpcUserIdGetBySession(c.(*gin.Context), token)
    if err != nil {
       golog.Error(err)
       return nil, err
    }

    // 还要增加接口权限 判断url是否有权限
    var result = webdto.NewWebCheckResult()
    result.Allowed = true
    result.ApiUserResult = webuser.ApiUserResult

    return result, nil
}

func (r AuthProxy) IfCheckRes() bool {
    return true
}
func (self *AuthProxy) IfCheckSession() bool {
    return true
}

注入业务中间件

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

func (this *WebRouters) InstallMiddleWare(router *gin.Engine) *gin.Engine {
    router.Use(webmiddlewares.CheckSessionToken(), webmiddlewares.CheckAllowed())
    router.Use(webmiddlewares.WebMiddleware()...)
    //router.Use(gin.)
    router.Use(middleware.RequestID(), middleware.Context(), gin.Recovery(), middleware.Cors())
    //router.Use(gin.Logger(),gindump.Dump())
    router.Use(gzip.Gzip(gzip.DefaultCompression))
    this.AddRouter(router)
    return router
}

标签:func,goweb,Context,router,go,gin,权限,com,webdto
From: https://blog.csdn.net/leijmdas/article/details/142329911

相关文章

  • Go Lang实现unix时间戳与日期格式互转
    /**golang几种post请求方式*参考:https://www.cnblogs.com/mafeng/p/7068837.html*/packagemainimport("fmt""io/ioutil""log""net/http""net/url""regexp""strings......
  • GBase GCDW warehouse相关权限
    GCDW中,warehouse相关权限有三个,MODIFY_WAREHOUSE、OPERATE_WAREHOUSE、USAGE_WAREHOUSE;对应功能如下:MODIFY_WARHEOUSE:允许角色创建,删除,启动,挂起,修改warehouse属性的权限。OPERATE_WAREHOUSE:允许角色使用warehouse资源执行sql的权限,同时如果目标warehouse正处于suspend......
  • google pinying notepad++
    https://www.xitongzhijia.net/soft/199553.htmlhttps://www.techspot.com/downloads/2010-notepad.html......
  • 26.删除有序数组中的重复项 Golang实现
    题目描述:给你一个非严格递增排列的数组nums,请你原地删除重复出现的元素,使每个元素只出现一次,返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。考虑nums的唯一元素的数量为k,你需要做以下事情确保你的题解可以被通过:更改......
  • mongodb 中rs.stauts()命令参数解析
    转载请注明出处:rs.status()命令用于获取MongoDB副本集的状态信息。它提供了关于副本集中各个节点的详细信息,包括节点的健康状况、角色、选举状态等。以下是查看一个mongo集群状态返回的参数:rs0:PRIMARY>rs.status(){"set":"rs0","date":ISODa......
  • 基于python+Django的学生成绩管理系统(源码+vue+前后端分离)
    收藏关注不迷路!!......
  • 如何修改URL命名规则 让他更适合Google SEO优化
    为了使URL更符合Google的SEO优化标准,您可以遵循以下原则来修改您的URL命名规则:简洁明了:URL应该尽可能短小,避免冗长的路径。使用有意义的单词而不是数字或不相关的短语。使用关键词:在URL中包含目标关键词可以帮助搜索引擎理解页面的内容。但是避免过度堆砌关键词,这可......
  • go多线程
    1、简单使用(这个执行完成,如果进程执行比较久,这里不会等待它们结束)packagemainimport"time"funcmain(){ gofunc(){ println("Hello,World!") }() time.Sleep(1*time.Second)}2、wg.Add(数量)使用,这个会等待,直到全部完成funcmain(){wg:=sync.......
  • 基于django+vue高校学科竞赛管理系统安全开发【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着高校教育改革的深入和对学生综合素质要求的不断提高,学科竞赛作为培养学生创新能力、实践能力及团队协作精神的重要平台,其重要性日益凸......
  • 基于django+vue高校信息化迎新系统【开题报告+程序+论文】-计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着信息技术的飞速发展,高校教育管理正逐步向数字化、智能化转型。传统的迎新工作,涉及学生信息的录入、宿舍分配、学费缴纳、助学贷款申请......