当前位置: 首页 > 面试题库 >

Negroni的路由特定中间件

徐俊楚
2023-03-14
问题内容

我有一个使用httprouter和negroni的Web服务器。用户通过外部OAuth登录此系统。我们将令牌保存到表明他们是否已登录的加密会话中。我想使用中间件来验证此令牌是否存在,如果不存在,则将用户踢回到登录页面。我想从身份验证中间件中排除一些路由。negroni自述文件中有一个使用大猩猩mux进行此操作的示例,但是我无法完全理解使用httprouter进行此操作的可扩展性。类似于我的服务器设置的内容如下:

router := httprouter.New()
router.GET("/login", Login) // auth not required
router.GET("/", Index)  // auth required

s := negroni.Classic()

s.Use(sessions.Sessions("example-web-dev", cookiestore.New([]byte("some garbage"))))
s.Use(authenticator.Get())
s.UseHandler(router)

/login路由在哪里我不想通过中间件要求授权,并且在哪里/authenticator.Get()是我的身份验证处理程序函数,其中包含我认为与问题无关的内容。

我怎样才能申请authenticator.Get()/,但不是/login?请记住,旁边还会有其他几条“公共”路线,/login以及许多其他封闭路线。

一些链接:

  • https://github.com/codegangsta/negroni
  • https://github.com/codegangsta/negroni/issues/25
  • http://godoc.org/github.com/codegangsta/negroni
  • http://godoc.org/github.com/julienschmidt/httprouter

问题答案:

最终,我得以在这个过程中全神贯注。解决方案是为每个单独的路线创建新的negroni.Negroni实例。在上述情况下:

router := httprouter.New()
router.Handler("GET", "/login",
               negroni.New(negroni.HandlerFunc(loginHandler)))
router.Handler("GET", "/",
               negroni.New(authenticator.Get(),
               negroni.HandlerFunc(indexHandler)))

server := negroni.Classic()
server.UseHandler(router)
server.Use(sessions.Sessions("example-web-dev",
           cookiestore.New([]byte("some secret"))))
server.Run(":3000")

loginHandler并且indexHandler都需要具有以下方法签名:

func(http.ResponseWriter, *http.Request, http.HandlerFunc)

在给定的示例中,所有路由都将使用所提供的中间件negroni.Classic()以及sessions添加到其中的中间件server,但仅/会使用在中创建的中间件authenticator.Get()



 类似资料:
  • Navigating Programmatically

  • 问题内容: 我只想验证一下内容,但无法在Express文档或在线文档中找到与此相关的内容(尽管我知道这是一个功能)。 我可以对其进行测试,但我实际上并没有一个很好的模板,想听听社区的意见。 如果我这样定义快递路线: 我还可以定义一个中间件并直接加载它,例如 但是,我还可以链接这些路由中的至少一个来运行额外的中间件,例如身份验证,如下所示: 这些是无限可链接的吗?如果我愿意,可以在给定的路由上添加1

  • 问题内容: 有谁知道是否有可能获得用于触发路线的路径? 例如,假设我有这个: 使用以下简单的中间件 我希望能够使用中间件,但不是。 问题答案: 你想要的是。 例如: http://expressjs.com/api.html#req.route 编辑: 正如评论中所解释的,进入中间件是困难/ hacky。路由器中间件是填充对象的中间件,它可能处于比您正在开发的中间件更低的级别。 这样,只有在您插入

  • 新反应: 我有一个 组件,我只想在用户访问特定页面时隐藏该组件。 App.JS: main.js:

  • 问题内容: 我在带有一些中间件功能的node.js中使用Express框架: 我可以将函数与附加参数一起使用,以仅在特定路径上使用此中间件: 是否可以使用path变量,以便将中间件用于除特定路径(即根路径)以外的所有路径? 我在想这样的事情: 因此,总是调用除根路径以外的其他路径。 问题答案: 我会将checkUser中间件添加到我的除首页之外的所有路径中。 要么 您可以使用下划线扩展它,以在未经

  • Negroni 是 Go 开发的 Http 中间件,非常小,没有侵入性,鼓励使用 ofnet/http 处理程序。如果你喜欢 Martini,又觉得它太过于复杂,那么 Negroni 非常适合你。 入门 安装Go并设置好 GOPATH之后,创建您的第一个.go文件。我们称之为server.go。 包主导入( “ fmt” “ net / http” “ github.com/urfave