在 clojure Ring 中传递会话状态

passing session state in clojure Ring

我正在为我的网站使用无密码登录系统,用户收到一封电子邮件并单击 link 进行身份验证。到目前为止,一切都很好。

如何创建或修改环中间件以保留和传递更新的 :session 值?

(GET "/login" []
  ; gets a user's email and sends them a link to authenticate.
)

(GET "/login/:key&:email&:timestamp" [key email timestamp :as request]
  ; uses the timestamp, key, and email to verify the key
  ; if it all checks out, then set some session values
  ; e.g.
  (def updatedRequestMap 
   (assoc-in request [:session :supa-secret-smoken-token] "supercool secretval")))

我如何确保将 updatedRequestMap 传递给未来的请求?

谢谢 (=

您的 login 处理程序创建一个响铃响应并将新更新的会话关联到该响铃响应中。

    
;; put this in your ns declaration
;; (:require [ring.util.response :refer [response]])

    (GET "/login/:key&:email&:timestamp" [key email timestamp :as request]
         (let [old-session (:session request)
               new-session (assoc old-session
                                  :supa-secret-smoken-token 
                                  "supercool secretval")]
           (-> (response "You are now logged in")
               (assoc :session new-session))))

我的建议是看看 ring-defaults 图书馆。它会添加 一些对您的应用程序非常有用的中间件,包括对会话的支持和 cookie 以及一些有用的安全默认设置。它添加的是标准环 中间件组件,因此您还应该检查各个中间件 组件文档以了解它如何帮助您更轻松地编写处理程序