Mikaelemmmm / go-zero-looklook

🔥基于go-zero(go zero) 微服务全技术栈开发最佳实践项目。Develop best practice projects based on the full technology stack of go zero (go zero) microservices.
https://go-zero.dev
MIT License
4.34k stars 809 forks source link

userid怎么传递给鉴权中间件? #121

Closed shiqinfeng1 closed 1 year ago

shiqinfeng1 commented 1 year ago

在用户权限管理中,需要通过中间件对用户的权限做控制,但是项目中SetUidToCtxMiddleware方法未实现,在go-zero中也没找到中间件如何获取上下文ctx的介绍, 是当前go-zero还不支持吗?

Mikaelemmmm commented 1 year ago

go-zero已经帮你实现了,你只需要使用即可。 go-zero实现代码位置:https://github.com/zeromicro/go-zero/blob/master/rest/handler/authhandler.go#L72 go-zero-looklook中使用例子:https://github.com/Mikaelemmmm/go-zero-looklook/blob/main/app/usercenter/cmd/api/internal/logic/user/detailLogic.go#L31

shiqinfeng1 commented 1 year ago

你说的这个代码我看到了,可以在业务逻辑接口中获取userid。 但是,我的需求是做操作权限管理(菜单管理,或者rbac权限控制),在token校验通过之后,拿到userid,然后在中间件中拦截请求,根据userid判断该用户(角色)是否有该接口的访问权限。对应逻辑在项目中的SetUidToCtxMiddleware方法中实现。

shiqinfeng1 commented 1 year ago

就是把请求上下文给中间件就行。另外还想到一个问题:这个中间件和jwt的处理顺序是在哪里确定的呢?

Mikaelemmmm commented 1 year ago

https://github.com/zeromicro/go-zero/blob/master/rest/engine.go#L100

shiqinfeng1 commented 1 year ago

https://github.com/zeromicro/go-zero/blob/master/rest/engine.go#L100

好像和这个问题没关系吧。 目前来看,在中间件中不支持获取上下文数据

shiqinfeng1 commented 1 year ago

找到了, 从request中可以获取上下文:

func (m *AuthInterceptorMiddleware) Handle(next http.HandlerFunc) http.HandlerFunc {
    return func(w http.ResponseWriter, r *http.Request) {
        ctx := r.Context()
        uid := ctxdata.GetUserId(ctx)
        logx.WithContext(ctx).Infof("get userid by AuthInterceptorMiddleware: %v", uid)
        next(w, r)
    }
}