2

我正在使用 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.

我试图了解朋友身份验证代码的工作原理,以确定进行绑定的正确位置,但到目前为止我还没有弄清楚。

4

1 回答 1

2

我猜你调用的方式current-authentication不正确,因为文档说你需要将当前请求传递给这个函数,所以它应该是这样的:

(binding [*username* ((friend/current-authentication req) :username)] ...

还要确保在您的用户名中间件之前应用朋友中间件。

于 2013-04-01T11:02:17.963 回答