我有我的Clojure的服務器中間件麻煩。我的應用程序有以下要求:將Clojure的環中間件以正確的順序
一些路線應該可以訪問沒有問題。其他人需要基本認證,所以我想有一個位於所有處理函數前面的認證函數,並確保請求得到驗證。我一直在使用環基本的身份驗證處理程序這一點,尤其是在how to separate your public and private routes的說明。
不過,我也很喜歡在
Authorization:
頭中發送PARAMS是在路由控制器可用。爲此,我一直在使用的Compojure在compojure.handler
site
功能,這使變量在: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?
功能來訪問,而不是在路線。
顯然,這不是一個很普通的例子,但我覺得我真的紡紗我的車輪,只是隨意更改到中間件秩序,希望工作的事情。我會很感激對於我的具體示例的一些幫助,並且更多地瞭解如何打包中間件以使事情正確執行。
感謝, 凱文