diff --git a/vblog/apps/blog/api/api.go b/vblog/apps/blog/api/api.go index 3350ccf..d260893 100644 --- a/vblog/apps/blog/api/api.go +++ b/vblog/apps/blog/api/api.go @@ -5,6 +5,7 @@ import ( "github.com/infraboard/mcube/v2/http/gin/response" "gitlab.com/go-course-project/go17/vblog/apps/blog" "gitlab.com/go-course-project/go17/vblog/apps/blog/impl" + "gitlab.com/go-course-project/go17/vblog/middleware" ) func NewBlogApiHandler() *BlogApiHandler { @@ -21,6 +22,7 @@ type BlogApiHandler struct { // book := server.Group("/api/tokens") func (h *BlogApiHandler) Registry(r *gin.Engine) { router := r.Group("/vblog/api/v1/blogs") + router.Use(middleware.Auth) router.POST("", h.CreateBlog) router.GET("", h.QueryBlog) } diff --git a/vblog/apps/blog/impl/impl.go b/vblog/apps/blog/impl/impl.go index a460dc7..bc32358 100644 --- a/vblog/apps/blog/impl/impl.go +++ b/vblog/apps/blog/impl/impl.go @@ -6,6 +6,7 @@ import ( "github.com/infraboard/mcube/v2/ioc/config/datasource" "gitlab.com/go-course-project/go17/vblog/apps/blog" + "gitlab.com/go-course-project/go17/vblog/middleware" ) var BlogService blog.Service = &BlogServiceImpl{} @@ -22,6 +23,10 @@ func (b *BlogServiceImpl) CreateBlog(ctx context.Context, in *blog.CreateBlogReq return nil, err } + // 冲上下文中补充 创建人 + tk := middleware.GetTokenFromCtx(ctx) + ins.CreateBy = tk.RefUserName + err = datasource.DBFromCtx(ctx).Create(ins).Error if err != nil { return nil, err diff --git a/vblog/apps/token/impl/impl.go b/vblog/apps/token/impl/impl.go index 2950dbe..97ceea2 100644 --- a/vblog/apps/token/impl/impl.go +++ b/vblog/apps/token/impl/impl.go @@ -69,5 +69,14 @@ func (t *TokenServiceImpl) ValidateToken(ctx context.Context, in *token.Validate return nil, err } + // 1. 补充用户信息 + u, err := t.user.DescribeUser(ctx, &user.DescribeUserRequest{ + DescribeBy: user.DESCRIBE_BY_ID, + Value: tk.RefUserId, + }) + if err != nil { + return nil, err + } + tk.RefUserName = u.Username return tk, nil } diff --git a/vblog/docs/middleware.drawio b/vblog/docs/middleware.drawio index e87bf44..00f745c 100644 --- a/vblog/docs/middleware.drawio +++ b/vblog/docs/middleware.drawio @@ -1,45 +1,45 @@ - + - + - + - + - + - + - + - + - + - - + + - + - - + + diff --git a/vblog/middleware/auth.go b/vblog/middleware/auth.go new file mode 100644 index 0000000..ac24e29 --- /dev/null +++ b/vblog/middleware/auth.go @@ -0,0 +1,49 @@ +package middleware + +import ( + "context" + "fmt" + "strings" + + "github.com/gin-gonic/gin" + "github.com/infraboard/mcube/v2/exception" + "github.com/infraboard/mcube/v2/http/gin/response" + "gitlab.com/go-course-project/go17/vblog/apps/token" + "gitlab.com/go-course-project/go17/vblog/apps/token/impl" +) + +// // HandlerFunc defines the handler used by gin middleware as return value. +// type HandlerFunc func(*Context) + +// 补充我们的鉴权逻辑 +// 1. 首先要获取Token, Cookie, Header, Authorization: 用于存放用户认证信息, Authorization: , Bearer xxxxxx +// 2. 校验Token +// 3. 注入用户信息 +func Auth(c *gin.Context) { + // 1. 获取Token + accessToken := c.GetHeader("Authorization") + tkList := strings.Split(accessToken, " ") + + accessToken = "" + if len(tkList) == 2 { + accessToken = tkList[1] + } + // 2. 校验Token + tk, err := impl.TokenService.ValidateToken(c.Request.Context(), token.NewValidateTokenRequest(accessToken)) + if err != nil { + response.Failed(c, exception.NewUnauthorized("令牌校验失败: %s", err)) + c.Abort() + return + } + + // 3. 注入用户信息 + ctx := context.WithValue(c.Request.Context(), TokenCtxKey{}, tk) + fmt.Println(tk) + c.Request = c.Request.WithContext(ctx) +} + +type TokenCtxKey struct{} + +func GetTokenFromCtx(ctx context.Context) *token.Token { + return ctx.Value(TokenCtxKey{}).(*token.Token) +}