Поместите промежуточное кольцо Clojure Ring в правильном порядке - PullRequest
4 голосов
/ 13 октября 2011

У меня проблемы с промежуточным ПО моего сервера Clojure. Мое приложение имеет следующие требования:

  • Некоторые маршруты должны быть доступны без проблем. Другие требуют базовой аутентификации, поэтому я хотел бы иметь функцию аутентификации, которая находится перед всеми функциями-обработчиками и обеспечивает проверку запроса. Для этого я использовал обработчик ring-basic-authentication, особенно инструкции по , как разделять ваши публичные и частные маршруты .

  • Однако я также хотел бы, чтобы параметры, отправляемые в заголовке Authorization:, были доступны в контроллере маршрута. Для этого я использовал функцию site Compojure в compojure.handler, которая помещает переменные в словарь :params запроса (см., Например, Отсутствующие параметры формы в запросе Compojure POST )

Однако я не могу получить разрешение 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?, но не в маршрутах.

Очевидно, это не очень общий пример, но я чувствую, что действительно крутлю свои колеса и просто произвольно меняю порядок промежуточного программного обеспечения и надеюсь, что все будет работать. Я был бы признателен за некоторую помощь как для моего конкретного примера, так и за то, чтобы узнать больше о том, как обернуть промежуточное программное обеспечение для правильной работы.

Спасибо, Kevin

1 Ответ

0 голосов
/ 13 октября 2011

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))

Точно так же вы можете использовать это для написания своего собственного промежуточного программного обеспечения, чтобы поместить связанные с аутентификацией вещи в параметры, если вы действительно этого хотите.

...