更新Clojure Friend中的用户认证映射



在Clojure的Friend认证库中,可以使用带有map参数的friend/authenticate来配置库。在我的例子中,对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*的变化?如果我传递了dedef -ed版本,那么似乎Friend只知道在应用程序初始化时可用的用户。

谢谢!

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

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

(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))

最新更新