我有一个使用httprouter和negroni的网络服务器。用户通过外部OAuth登录此系统。我们将令牌保存到加密会话中,该会话指示他们是否已登录。我想使用中间件来验证此令牌是否存在,然后将用户踢回登录页面(如果不存在)。我想从使用身份验证中间件中排除一些路由。在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
以及许多其他门控路线也会有其他几条“公共”路线。
一些链接:
答案 0 :(得分:4)
我最终能够围绕这个过程包围我的大脑。解决方案是为每条路线创建新的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()
。
答案 1 :(得分:-1)
如果使用httprouter,可以通过调用router.Lookup函数来检索params。这是我做的:
_,params,_:= router.Lookup(“GET”,req.URL.Path) 其中router是httprouter.Router的实例