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