gpt4 book ai didi

web - 使用 Negroni 的路由特定中间件

转载 作者:IT王子 更新时间:2023-10-29 00:45:25 25 4
gpt4 key购买 nike

我有一个使用 httprouter 和 negroni 的网络服务器。用户通过外部 OAuth 登录该系统。我们将 token 保存到加密 session 中,指示他们是否已登录。我想使用中间件来验证此 token 是否存在,如果不存在,则将用户踢回登录页面。我想排除某些路由使用身份验证中间件。 negroni README 中有一个使用 gorilla 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 之外还有其他几条“公共(public)”路线以及许多其他门控路线。

一些链接:

最佳答案

我最终能够全神贯注于这个过程。解决方案是为每条单独的路线创建新的 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")

loginHandlerindexHandler 都需要有这个方法签名:

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

在给定的示例中,所有路由都将使用 negroni.Classic() 提供的中间件和添加到 serversessions 中间件,但只有 / 会使用我在 authenticator.Get() 中创建的中间件。

关于web - 使用 Negroni 的路由特定中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28418168/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com