Оказывается, что metosin / reitit создает одно хранилище сеансов для каждого маршрута (для получения дополнительной информации обратитесь к Issue 205 ); другими словами, защита от подделки звонков не работает, потому что reitit не использует одно и то же хранилище сеансов для каждого маршрута.
На момент получения ответа сопровождающий предлагает следующее (скопировано из вопроса для удобства ссылок в переполнении стека):
- смонтировать wrap-сессию вне маршрутизатора, чтобы для всего приложения был только один экземпляр mw. Для этого есть опция промежуточного программного обеспечения в обработчике кольца:
(require '[reitit.ring :as ring])
(require '[ring.middleware.session :as session])
(defn handler [{session :session}]
(let [counter (inc (:counter session 0))]
{:status 200
:body {:counter counter}
:session {:counter counter}}))
(def app
(ring/ring-handler
(ring/router
["/api"
["/ping" handler]
["/pong" handler]])
(ring/create-default-handler)
;; the middleware on ring-handler runs before routing
{:middleware [session/wrap-session]}))
- создайте одно хранилище сеансов и используйте его в таблице маршрутизации (все экземпляры промежуточного программного обеспечения сеансов будут совместно использовать одно хранилище).
(require '[ring.middleware.session.memory :as memory])
;; single instance
(def store (memory/memory-store))
;; inside, with shared store
(def app
(ring/ring-handler
(ring/router
["/api"
{:middleware [[session/wrap-session {:store store}]]}
["/ping" handler]
["/pong" handler]])))
В этом ответе не показан третий вариант, который сопровождающий призывает к PR.