2011-10-13 51 views
4

我有我的Clojure的服務器中間件麻煩。我的應用程序有以下要求:將Clojure的環中間件以正確的順序

  • 一些路線應該可以訪問沒有問題。其他人需要基本認證,所以我想有一個位於所有處理函數前面的認證函數,並確保請求得到驗證。我一直在使用環基本的身份驗證處理程序這一點,尤其是在how to separate your public and private routes的說明。

  • 不過,我也很喜歡在Authorization:頭中發送PARAMS是在路由控制器可用。爲此,我一直在使用的Compojure在compojure.handlersite功能,這使變量在: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

據我所知,ring.middleware.basic認證不宣讀了什麼:PARAMS在請求和ring.core.request /網站不把任何身份驗證相關的有兩種。

但在任何環處理程序,您仍然可以訪問頭。喜歡的東西:

(GET "/hello" 
    {params :params headers :headers} 
    (str "your authentication is " (headers "authentication") 
     " and you provided " params)) 

同樣,你可以用它來編寫自己的中間件把認證相關的東西在PARAMS,如果你真的想。