0

我有一个ring使用noir.session如下的 webapp:

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

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

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

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

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

4

1 回答 1

2

浏览所有相关中间件的源代码,我发现 lib-noirwrap-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)))

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

于 2017-07-23T11:56:34.280 回答