我正在尝试将朋友与鲁米努斯 (基本上是利伯-黑尔)结合使用,并且我发现根本没有调用我的:credential-fn。一开始,我想可能是我添加了中间件错误,但我尝试设置一个自定义:login-failure-handler来查看至少这样做是否有效。
下面是我的应用程序的样子:
(defroutes my-routes
(GET "/login" [login_failed username]
(login-page login_failed username)) ;; login-page just renders HTML form
(GET "/logout" req
(friend/logout* (resp/redirect (str (:context req) "/")))))
(defn login-failure-handler [req]
(println "Failed") ;; <-- get's printed and redirects no problem
(redirect "/login?failed=Y"))
(defn credential-fn [creds-map]
(println creds-map) ;; <-- doesn't get printed at all
{:identity "test" :roles [::user]})
;; define custom wrapping middleware as noir's middleware/app-handler does
;; its own thing with routes + middleware
(defn authenticate [handler]
(friend/authenticate
handler
{:workflows [(workflows/interactive-form
:credential-fn credential-fn
:login-failure-handler login-failure-handler)]}))
(defn debugger [handler]
(fn [req]
(println req)
(handler req)))
(def app (middleware/app-handler
;; add your application routes here
[my-routes]
;; add custom middleware here
:middleware [debugger authenticate]
;; add access rules here
:access-rules []
;; serialize/deserialize the following data formats
;; available formats:
;; :json :json-kw :yaml :yaml-kw :edn :yaml-in-html
:formats [:json-kw :edn]))我还添加了一个debugger中间件,它只打印出请求地图,我注意到当我单击登录表单的submit按钮(即没有发生POST请求)时,它根本不打印任何东西。它会立即打印出到达login-failure-handler的信息。
我错过了什么?
发布于 2014-01-26 01:14:29
结果我的登录表格不正确。朋友特别期望来自POST请求的两个表单params,username和password。因此,登录表单需要有这两个字段。似乎没有办法在朋友这边定制这些字段,我认为这是一个缺陷。
发布于 2014-01-25 20:22:36
您需要像这样将您的credential-fn传递给friend/authenticate:
(friend/authenticate
handler
{:credential-fn credential-fn
:workflows [(workflows/interactive-form)]})https://stackoverflow.com/questions/21353074
复制相似问题