Я пытаюсь использовать Friend с Luminus (в основном lib-noir), и я обнаружил, что мой :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
, которое просто распечатывает карту запроса, и я заметил, что оно вообще не печатает ничего, когда я нажимаю кнопку отправки формы входа (т.е. нет запроса POST это происходит). Он просто сразу выводит GET на login-failure-handler
.
Что я упустил?