現在、Compojure (および Ring と関連するミドルウェア) を使用して Clojure で API を作成しています。
ルートに応じて異なる認証コードを適用しようとしています。次のコードを検討してください。
(defroutes public-routes
(GET "/public-endpoint" [] ("PUBLIC ENDPOINT")))
(defroutes user-routes
(GET "/user-endpoint1" [] ("USER ENDPOINT 1"))
(GET "/user-endpoint2" [] ("USER ENDPOINT 1")))
(defroutes admin-routes
(GET "/admin-endpoint" [] ("ADMIN ENDPOINT")))
(def app
(handler/api
(routes
public-routes
(-> user-routes
(wrap-basic-authentication user-auth?)))))
(-> admin-routes
(wrap-basic-authentication admin-auth?)))))
wrap-basic-authentication
実際にはルートをラップするため、ラップされたルートに関係なく試行されるため、これは期待どおりに機能しません。具体的には、リクエストを にルーティングする必要がある場合でもadmin-routes
、user-auth?
が試行されます (そして失敗します)。
私はいくつかのルートを共通のベース パスの下にルートcontext
するために使用することにしましたが、これはかなりの制約です (以下のコードは単にアイデアを説明するためのものであり、機能しない可能性があります)。
(defroutes user-routes
(GET "-endpoint1" [] ("USER ENDPOINT 1"))
(GET "-endpoint2" [] ("USER ENDPOINT 1")))
(defroutes admin-routes
(GET "-endpoint" [] ("ADMIN ENDPOINT")))
(def app
(handler/api
(routes
public-routes
(context "/user" []
(-> user-routes
(wrap-basic-authentication user-auth?)))
(context "/admin" []
(-> admin-routes
(wrap-basic-authentication admin-auth?))))))
defroutes
何かが欠けているのか、それとも共通の基本パスを使用せずに(理想的には何もない)自分に制約を与えずに欲しいものを達成する方法があるのか どうか疑問に思っています.