在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只会知道在应用程序初始化时可用的用户。
谢谢!
答案 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))