Доступ к данным сеанса в кольцевом промежуточном программном обеспечении

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

(def app
  (->
    (handler/site app-routes)
    (wrap-user-auth) ; <--- my middleware
    (session/wrap-session {:store (cookie-store {:key "something super secret"})})))

Промежуточное ПО:

(defn wrap-user-auth [handler]
  (fn [request]
    (println request )
    (let [user (get (request :session) :user nil)]
      (let [response
            (handler
              (if-not (nil? user)
                (assoc request :user user :is_authenticated? true)
                (assoc request :user nil :is_authenticated? false)))]
        response
        ))))

Данные сеанса всегда пусты при печати запроса, даже если они были установлены и доступны через представления. Я пытался возиться с порядком промежуточного программного обеспечения, но не могу понять, почему атом пуст.

Какой-то случайный маршрут, по которому доступны данные сеанса

(ANY "/foo" request (println (request :session)))

person dvcrn    schedule 09.12.2014    source источник


Ответы (1)


Нашел решение.

Оказывается, эта проблема «несколько» связана с Compojure/Ring: почему сеанс с cookie-store не сохраняется после перезапуска сервера?, что объясняет использование двух промежуточных программ сеанса: одного от compojure, другого от wrap-session. После замены обоих промежуточных программ на один и тот же механизм хранения атом заполняется данными моего сеанса, хотя я не совсем понимаю, почему.

Я ставлю это как ответ, а не комментарий, поскольку он решает реальную проблему. Рад слышать, почему это происходит!

person dvcrn    schedule 09.12.2014