Search code examples
clojureringcompojure

Accessing session data in ring middleware


I'm trying to access basic session data in a ring middleware to, in my case, copy user data into the request for easier access.

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

Session data is always empty when printing request, even though it has been set and is accessible through the views. I tried messing around with middleware order but can't figure out why the atom is empty.

Some random route where session data is available

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

Solution

  • Found a solution.

    Turns out this problem is 'somewhat' related to Compojure/Ring: Why doesn't a session with cookie-store survive a server restart?, which explains that 2 session middleware are being used: One by compojure, one by wrap-session. After changing both middleware to the same storage engine, the atom is filled with my session data - although I don't quite understand why.

    I am putting this as an answer rather than a comment since it solves the actual problem. Happy to hear why this is happening though!