我正在使用 Clojure 的Friend Authentication Library将 HTTP 基本身份验证添加到我的 webapp。
我在一个模块中有一组数据库访问函数,db.clj
它抽象出当前用户,因此我可以调用诸如(db/get-item ...)
检索当前用户的项目之类的方法,而无需显式指定用户。我通过定义一个名为*username*
. 这使我可以轻松地在 REPL 中为不同用户测试数据库访问功能,然后 webapp 代码可以*username*
在调用 db 函数时重新绑定到会话用户。
我需要*username*
为当前会话绑定到用户,以便每当db.clj
从 Web 服务器请求访问函数时,*username*
var 设置正确。
我可以从中获取会话用户名,((friend/current-authentication) :username)
但我不知道在哪里可以将其连接到网络服务器代码中。我有一个简单的中间件:
(defn wrap-username [app]
(fn [req]
(binding [*username* (friend/current-authentication :username)]
(app req))))
但无论我从哪里调用这个中间件,current-authentication
总是返回nil
.
我试图了解朋友身份验证代码的工作原理,以确定进行绑定的正确位置,但到目前为止我还没有弄清楚。