【问题标题】:Updating user authentication map in Clojure Friend在 Clojure Friend 中更新用户身份验证映射
【发布时间】:2015-08-27 23:30:07
【问题描述】:

在 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* 包含动态更新的用户条目映射。

如何配置 Friend 以便它知道 *users* 的更改?如果我通过 deref-ed 版本,那么似乎 Friend 只会在应用程序初始化时知道​​可用的用户。

谢谢!

【问题讨论】:

    标签: clojure


    【解决方案1】:

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

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

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

    这样您就可以做任何您想做的事情(例如从数据库而不是地图加载帐户信息)。但如果你愿意,你也可以使用地图。如果您想继续使用地图,您可以将负载信用定义为:

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

    【讨论】:

    • 谢谢!它非常有效!在确定特定值是在编译时还是运行时绑定时遇到问题,您的回答对此有所了解。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-20
    • 1970-01-01
    • 1970-01-01
    • 2013-12-14
    • 2018-03-19
    • 2015-10-12
    • 1970-01-01
    相关资源
    最近更新 更多