我的Clojure服务器中间件出现问题。我的应用程序有以下要求:
应该可以访问某些路线而没有任何问题。其他人需要基本身份验证,因此我希望拥有一个位于所有处理函数前面的身份验证功能,并确保验证请求。我一直在使用ring-basic-authentication处理程序,尤其是how to separate your public and private routes上的说明。
但是,我也希望在Authorization:
标题中发送的参数在路由控制器中可用。为此,我一直在site
中使用Compojure的compojure.handler
函数,它将变量放在请求的:params
字典中(参见例如Missing form parameters in Compojure POST request)
但是我似乎无法同时获得401授权和参数。如果我试试这个:
; this is a stripped down sample case:
(defn authenticated?
"authenticate the request"
[service-name token]
(:valid (model/valid-service-and-token service-name token)))
(defroutes token-routes
(POST "/api/:service-name/phone" request (add-phone request)))
(defroutes public-routes
controller/routes
; match anything in the static dir at resources/public
(route/resources "/"))
(defroutes authviasms-handler
public-routes
(auth/wrap-basic-authentication
controller/token-routes authenticated?))
;handler is compojure.handler
(def application (handler/site authviasms-handler))
(defn start [port]
(ring/run-jetty (var application) {:port (or port 8000) :join? false}))
授权变量可在authenticated?
函数中访问,但不能在路由中访问。
显然,这不是一个非常普遍的例子,但我觉得我真的在旋转我的轮子,只是随意地对中间件订单做出改变,并希望事情有效。我非常感谢我的具体示例,并了解如何包装中间件以使事情正确执行。
谢谢, 凯文
答案 0 :(得分:0)
AFAIK,ring.middleware.basic-authentication不会从请求中的:params读取任何内容,而ring.core.request / site也不会在其中放置任何与身份验证相关的内容。
但是在任何环处理程序中,您仍然可以访问标头。类似的东西:
(GET "/hello"
{params :params headers :headers}
(str "your authentication is " (headers "authentication")
" and you provided " params))
同样,如果你真的想要,你可以用它来编写自己的中间件,将认证相关的东西放在参数中。