在Clojure Friend中更新用户身份验证映射

时间:2015-08-27 15:02:33

标签: clojure

在Clojure的Friend身份验证库中,可以使用friend/authenticate和map参数来配置库。在我的情况下,对friend/authenticate的调用如下所示:

  (friend/authenticate {:login-uri "/login"
                        :default-landing-uri "/index.html"
                        :unauthorized-redirect-uri "/login"
                        :credential-fn (partial creds/bcrypt-credential-fn @users/*users*)
                        :workflows [(workflows/interactive-form)]})

请注意,:credential-fn传递了对全局原子*users*的引用。在我的应用程序中,可以动态添加/删除/更新用户,*users*包含动态更新的用户条目映射。

如何配置好朋友以便了解*users*的更改?如果我通过了deref-ed版本,那么看起来Friend只会知道在应用程序初始化时可用的用户。

谢谢!

1 个答案:

答案 0 :(得分:1)

代码中的问题是部分函数在创建部分函数时derefs用户映射的值。因此,对地图的更改不会改变您定义的部分函数的行为。

您可以像这样定义自己的凭据函数:

(friend/authenticate routes
  {:credential-fn (partial creds/bcrypt-credential-fn
                    (fn [username]
                      (load-creds username))) ;the code can be simplified here
   :workflows [(workflows/interactive-form)]})

其中load-creds是一个加载特定用户名凭据的函数。此函数应返回如下内容:

{:username "some-username"
 :password (creds/hash-bcrypt "user_password")
 :roles #{::user}}

通过这种方式,您可以执行任何操作(例如,从数据库而不是地图加载帐户信息)。但是如果你愿意,你也可以使用地图。如果您想继续使用map,可以将load-creds定义为:

(defn load-creds [username]
   (get @users/*users* username))