我正在使用Goji(https://github.com/zenazn/goji),并希望定义具有自己的中间件的路由组.例如,下面的所有路径/company
都应使用LDAP身份验证,并定义中间件来执行此操作.所有路径都/external
使用不同类型的身份验证,因此它们具有不同的中间件定义.但这是在同一端口上提供的单个应用程序,因此我不想完全创建单独的Web服务 - 只是路径(和某些特定路由)可能使用不同的中间件.
我在Goji上看到的所有示例都是针对所有路由使用一组中间件,所以我不确定如何以干净的方式完成此任务.另外,如果我可以为路由组中的所有路由指定基本路径,那将会很好,类似于我在其他路由框架中看到的路径.
我是否在Goji库(或扩展名为net/http)中缺少此功能,这允许我将路由组合在一起并让每个组使用自己的中间件堆栈?
我想要实现的是这样的(psedocode):
// Use an LDAP authenticator for:
// GET /company/employees
// and
// POST /company/records
companyGroup = &RouteGroup{"basePath": "/company"}
companyGroup.Use(LDAPAuthenticator)
companyGroup.Add(goji.Get("/employees", Employees.ListAll))
companyGroup.Add(goji.Post("/records", Records.Create))
// Use a special external user authenticator for: GET /external/products
externalGroup = &RouteGroup{"basePath": "/external"}
externalGroup.Use(ExternalUserAuthenticator)
externalGroup.Add(goji.Get("/products", Products.ListAll))
Run Code Online (Sandbox Code Playgroud)
您应该可以使用以下内容解决问题:
// Use an LDAP authenticator
companyGroup := web.New()
companyGroup.Use(LDAPAuthenticator)
companyGroup.Get("/company/employees", Employees.ListAll)
companyGroup.Post("/company/records", Records.Create)
goji.Handle("/company/*", companyGroup)
// Use a special external user authenticator for: GET /external/products
externalGroup := web.New()
externalGroup.Use(ExternalUserAuthenticator)
externalGroup.Get("/external/products", Products.ListAll)
goji.Handle("/external/*", externalGroup)
Run Code Online (Sandbox Code Playgroud)
你需要给每个组别一个web
.请记住,您需要指定组成员中的完整路径.