我正在使用Friend Authentication Library for Clojure将HTTP基本身份验证添加到我的webapp。
我在db.clj
模块中有一组数据库访问函数,它们抽象出当前用户,因此我可以调用像(db/get-item ...)
这样的方法来检索当前用户的项目,而无需显式指定用户。我这样做是通过定义一个名为*username*
的动态变量来实现的。这允许我在不同用户的REPL上轻松测试数据库访问功能,然后webapp代码可以在调用db函数时将*username*
重新绑定到会话用户。
我需要将*username*
绑定到当前会话的用户,以便只要从Web服务器请求访问db.clj
中的函数,就会正确设置*username*
var。
我可以从((friend/current-authentication) :username)
获取会话用户名,但我无法弄清楚我可以将其挂钩到网络服务器代码中。我有一个简单的中间件:
(defn wrap-username [app]
(fn [req]
(binding [*username* (friend/current-authentication :username)]
(app req))))
但无论我从何处调用此中间件,current-authentication
始终返回nil
。
我试图了解朋友身份验证代码是如何工作的,以确定我的绑定的正确位置,但到目前为止我还没弄明白。
答案 0 :(得分:2)
我猜你调用current-authentication
的方式不正确,因为文档说你需要将当前请求传递给这个函数,所以它应该是这样的:
(binding [*username* ((friend/current-authentication req) :username)] ...
还要确保在您的用户名中间件之前应用好友中间件。