2014-01-25 2 views
2

Я пытаюсь использовать Friend с Luminus (в основном lib-noir), и я обнаружил, что мой :credential-fn не называется вообще. Сначала я подумал, что, возможно, я неправильно добавил промежуточное программное обеспечение, но я попытался настроить пользовательский :login-failure-handler, чтобы узнать, по крайней мере, это сработало, и это произошло.: credential-fn не вызывается другом/аутентифицирует промежуточное программное обеспечение?

Вот как мое приложение выглядит следующим образом:

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

Что я пропустил?

ответ

2

Оказывается, моя форма Войти был неверен. Друг конкретно ожидает 2 формы params из запроса POST, username и password. Поэтому форма входа нуждается в, чтобы иметь эти два поля. Кажется, что нет способа настроить эти поля на стороне друга, что я считаю недостатком.

+0

Это кажется распространенным [ошибка] (http://stackoverflow.com/questions/21189236/friend-authentication-empty-param/21224840#21224840), если вы хотите просто использовать предоставленные рабочие процессы, но я боюсь, что не могу согласиться с вами , это не недостаток. Вы можете легко разветвить любой рабочий процесс и настроить имена параметров, см. Https://github.com/cemerick/friend/blob/master/src/cemerick/friend/workflows.clj#L77-78 –

0

Вам необходимо пройти ваш credential-fn к friend/authenticate так:

(friend/authenticate 
    handler 
    {:credential-fn credential-fn 
    :workflows [(workflows/interactive-form)]}) 
+0

Я пробовал оба стиля. Я показал последнее, так как это был «рекомендуемый» путь от README. Тот же результат с обоими. Нужно ли добавлять POST-маршрут для «/ login»? Однако в документах это не говорится. Я добавил форму входа в систему. – john2x