2015-08-27 60 views
0

在Clojure的Friend認證庫中,可以使用帶有地圖參數的friend/authenticate來配置該庫。在我的情況下調用friend/authenticate看起來是這樣的:在Clojure Friend中更新用戶認證地圖

(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*的更改?如果我通過deref-ed版本,那麼似乎朋友只會知道在應用程序初始化時可用的用戶。

謝謝!

回答

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)]}) 

當負載creds是裝入特定的用戶名憑據的功能。這個函數應該返回類似:

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

無論你想通過這種方式,你可以做(​​例如負載從數據庫帳戶信息,而不是一個地圖)。但是如果你願意,你還可以使用地圖。如果你想繼續使用地圖,你可以定義負載信譽爲:

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

謝謝!它奇妙的工作!在確定某個特定值是否在編譯時或運行時受到約束時,我遇到了問題,您的回答揭示了一些問題。 – siphiuel