如何使用Clojure Friend库将当前用户会话绑定到动态var?

时间:2013-03-31 21:24:51

标签: authentication clojure

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

我试图了解朋友身份验证代码是如何工作的,以确定我的绑定的正确位置,但到目前为止我还没弄明白。

1 个答案:

答案 0 :(得分:2)

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

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

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