From 0c58cd9c5ae392f997ce5acd5f25fc791d80d8bd Mon Sep 17 00:00:00 2001 From: felixhao Date: Tue, 16 Apr 2019 16:50:34 +0800 Subject: [PATCH] add doc with blademaster --- doc/img/bm-arch-2-2.png | Bin 0 -> 9888 bytes doc/img/bm-arch-2-3.png | Bin 0 -> 31327 bytes doc/img/bm-handlers.png | Bin 0 -> 25036 bytes doc/wiki-cn/blademaster-mid.md | 104 ++++++++++++ doc/wiki-cn/blademaster-mod.md | 79 +++++++++ doc/wiki-cn/blademaster-quickstart.md | 64 ++++++++ doc/wiki-cn/blademaster.md | 33 ++++ doc/wiki-cn/summary.md | 6 +- .../blademaster/middleware/auth/README.md | 7 + .../http/blademaster/middleware/auth/auth.go | 153 ++++++++++++++++++ .../middleware/auth/example_test.go | 40 +++++ tool/kratos/template.go | 27 ++-- 12 files changed, 500 insertions(+), 13 deletions(-) create mode 100644 doc/img/bm-arch-2-2.png create mode 100644 doc/img/bm-arch-2-3.png create mode 100644 doc/img/bm-handlers.png create mode 100644 doc/wiki-cn/blademaster-mod.md create mode 100644 doc/wiki-cn/blademaster-quickstart.md create mode 100644 pkg/net/http/blademaster/middleware/auth/README.md create mode 100644 pkg/net/http/blademaster/middleware/auth/auth.go create mode 100644 pkg/net/http/blademaster/middleware/auth/example_test.go diff --git a/doc/img/bm-arch-2-2.png b/doc/img/bm-arch-2-2.png new file mode 100644 index 0000000000000000000000000000000000000000..ba2163f85fd2b42560f79eb75cad6bcf57b5b48d GIT binary patch literal 9888 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 0 { + setMid(ctx, mid) + return + } + + ec := ecode.Cause(err) + if ecode.Equal(ec, ecode.Unauthorized) { + ctx.JSON(nil, ec) + ctx.Abort() + return + } +} + +// set mid into context +// NOTE: This method is not thread safe. +func setMid(ctx *bm.Context, mid int64) { + ctx.Set(metadata.Mid, mid) + if md, ok := metadata.FromContext(ctx); ok { + md[metadata.Mid] = mid + return + } +} diff --git a/pkg/net/http/blademaster/middleware/auth/example_test.go b/pkg/net/http/blademaster/middleware/auth/example_test.go new file mode 100644 index 000000000..f1e20ea21 --- /dev/null +++ b/pkg/net/http/blademaster/middleware/auth/example_test.go @@ -0,0 +1,40 @@ +package auth_test + +import ( + "fmt" + + bm "github.com/bilibili/kratos/pkg/net/http/blademaster" + "github.com/bilibili/kratos/pkg/net/http/blademaster/middleware/auth" + "github.com/bilibili/kratos/pkg/net/metadata" +) + +// This example create a identify middleware instance and attach to several path, +// it will validate request by specified policy and put extra information into context. e.g., `mid`. +// It provides additional handler functions to provide the identification for your business handler. +func Example() { + myHandler := func(ctx *bm.Context) { + mid := metadata.Int64(ctx, metadata.Mid) + ctx.JSON(fmt.Sprintf("%d", mid), nil) + } + + authn := auth.New(&auth.Config{ + DisableCSRF: false, + }) + + e := bm.DefaultServer(nil) + + // mark `/user` path as User policy + e.GET("/user", authn.User, myHandler) + // mark `/mobile` path as UserMobile policy + e.GET("/mobile", authn.UserMobile, myHandler) + // mark `/web` path as UserWeb policy + e.GET("/web", authn.UserWeb, myHandler) + // mark `/guest` path as Guest policy + e.GET("/guest", authn.Guest, myHandler) + + o := e.Group("/owner", authn.User) + o.GET("/info", myHandler) + o.POST("/modify", myHandler) + + e.Start() +} diff --git a/tool/kratos/template.go b/tool/kratos/template.go index 2a250e303..95ef99c14 100644 --- a/tool/kratos/template.go +++ b/tool/kratos/template.go @@ -120,6 +120,7 @@ func main() { # Reviewer ` + _tplDao = `package dao import ( @@ -312,11 +313,12 @@ func (s *Service) Close() { import ( "net/http" + "{{.Name}}/internal/model" "{{.Name}}/internal/service" + "github.com/bilibili/kratos/pkg/conf/paladin" "github.com/bilibili/kratos/pkg/log" bm "github.com/bilibili/kratos/pkg/net/http/blademaster" - "github.com/bilibili/kratos/pkg/net/http/blademaster/middleware/verify" ) var ( @@ -337,19 +339,18 @@ func New(s *service.Service) (engine *bm.Engine) { } svc = s engine = bm.DefaultServer(hc.Server) - initRouter(engine, verify.New(nil)) + initRouter(engine) if err := engine.Start(); err != nil { panic(err) } return } -func initRouter(e *bm.Engine, v *verify.Verify) { +func initRouter(e *bm.Engine) { e.Ping(ping) - e.Register(register) g := e.Group("/{{.Name}}") { - g.GET("/start", v.Verify, howToStart) + g.GET("/start", howToStart) } } @@ -360,14 +361,14 @@ func ping(ctx *bm.Context) { } } -func register(c *bm.Context) { - c.JSON(map[string]interface{}{}, nil) -} - // example for http request handler. func howToStart(c *bm.Context) { - c.String(0, "Golang 大法好 !!!") + k := &model.Kratos{ + Hello: "Golang 大法好 !!!", + } + c.JSON(k, nil) } + ` _tplAPIProto = `// 定义项目 API 的 proto 文件 可以同时描述 gRPC 和 HTTP API // protobuf 文件参考: @@ -411,7 +412,11 @@ message HelloReq { //go:generate TODO:待完善工具protoc.sh ` _tplModel = `package model -` + +// Kratos hello kratos. +type Kratos struct { + Hello string +}` _tplGRPCServer = `package grpc import (