【问题标题】:Weird session management bug when mixing ring's `wrap-defaults`' and lib-noir's `wrap-noir-session`混合 ring 的 `wrap-defaults` 和 lib-noir 的 `wrap-noir-session` 时出现奇怪的会话管理错误
【发布时间】:2017-07-23 11:56:34
【问题描述】:

我有一个使用noir.sessionring webapp,如下所示:

(def app (-> app-routes
         (session/wrap-noir-session)
         (wrap-defaults site-defaults))) ; both from ring.middleware.defaults

但是,似乎会话变量在请求之间丢失了。即使客户端提供了Cookie 标头,服务器也会继续发送Set-Cookie 标头。

通过反复试验,我发现当我按如下方式禁用环的防伪包装器时,相同的会话存在于请求中:

(def app (-> app-routes
         (session/wrap-noir-session)
         (wrap-defaults (assoc-in site-defaults [:security :anti-forgery] false))))

但我当然不希望那样。为什么会这样?如何在不冒 CSRF 攻击的情况下解决我的问题?

【问题讨论】:

    标签: clojure ring lib-noir


    【解决方案1】:

    浏览所有相关中间件的源代码,我发现 lib-noir 的 wrap-noir-session 重新实现了 ring 的 wrap-session 的部分内容。这导致我进行了以下实验:

    (def app (-> app-routes
             (session/wrap-noir-session {:store (memory-store)})
             (wrap-defaults (assoc site-defaults :session false))))
    

    同样,会话跨请求进行。

    这是罪魁祸首:wrap-defaults 已经应用了wrap-session,所以当wrap-noir-session 处理程序也被列出时,wrap-session 实际上被调用了两次。

    最终的解决方案再简单不过了:改用wrap-noir-session*根据文档,它“预计已经使用了 wrap-session。” wrap-noir-session 似乎恰恰相反。

    (def app (-> app-routes
             (session/wrap-noir-session*)
             (wrap-defaults site-defaults)))
    

    希望这会为您节省一些时间。

    【讨论】:

      猜你喜欢
      • 2013-04-23
      • 1970-01-01
      • 2018-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      相关资源
      最近更新 更多