2014-12-09 3 views
1

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

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

Middleware:

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

ответ

1

Найдено решение.

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

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