Iris + Casbin 权限控制实战
在木犀的 PaaS 云平台的设计中,需要有一个细粒度比较小的权限控制系统。不同用户对不同的资源,拥有不同的权限。土办法已经不管用了,我们需要更系统,更规范的权限控制系统。本文讲的就是如何将权限控制库 Casbin 接入 Iris Web 框架。 Iris 中间件机制简介 Iris 这个框架是基于中间件的,和 Nodejs 的 Koa 和 Express 很像。所谓中间件机制,就是一个请求到达之后,会生成一个上下文信息,里面包含了这个请求的一些信息。然后我们依次调用中间件函数,把上下文对象作为参数传入。需要注意是中间件函数的调用是嵌套的,在中间件函数中我们可以调用 ctx.Next() 方法,进入下一个中间件函数。当最后一个中间件函数返回时,之前调用过的中间件会依次返回。这个数据流被形象的称为“洋葱模型”。 一个典型的中间件是这样的: func middleware(ctx iris.Context) { // get info from context requestPath := ctx.Path() // set info with context ctx.Values().Set("info", shareInformation) // call next middleware ctx.Next() } 我们可以在中间件中读取 ctx 结构,根据上面附带的信息,我们可以做一些针对性的事情。 一个常用的中间件场景就是访问控制。我们可以根据 ctx 上带的用户信息,来查看用户的权限,如果用户没有要访问的资源的权限,我们就拒绝这次访问。比如这样: func auth(ctx iris.Context) { // check if user has permission if !c.Check(ctx.Request()) { ctx.StatusCode(http.StatusForbidden) // Status Forbiden ctx.StopExecution() return } ctx....