2015-03-25 5 views
1

Я несколько дней боролся, пытаясь получить простое использование библиотеки безопасности, Друг, для работы с шаблоном clst/cljs Chestnut.Как добавить Друг auth в шаблон каштана

A POST запрос /login uri должен войти в систему и разрешить доступ к защищенным маршрутам, таким как /role-user. Но по какой-то причине я не могу войти в систему, POST возвращает 303 и перенаправляет меня обратно на корневую страницу.

Я добавил промежуточное ПО Друга внутри функции http-обработчика. Является ли это подходящим местом для применения такого рода промежуточного программного обеспечения? Я подумал, может быть, промежуточное ПО перезагрузки или api-defaults может испортить промежуточное ПО друг друга? Однако удаление их не исправить.

(def http-handler 
    (if is-dev? 
    (-> #'routes 
     (reload/wrap-reload) 
     (friend/authenticate 
      {:allow-anon? true 
      :login-uri "/login" 
      :default-landing-uri "/" 
      :unauthorized-handler #(-> (h/html5 [:h2 "You do not have sufficient privileges to access " (:uri %)]) 
             resp/response 
             (resp/status 401)) 
      :credential-fn (fn [x] 
          (let [res (creds/bcrypt-credential-fn @users x)] 
           (log/info x) 
           (log/info res) 
           res)) 
      :workflows [(workflows/interactive-form)]}) 
     (wrap-defaults api-defaults)) 
    (wrap-defaults routes api-defaults))) 

Основываясь на показаниях печати мне удалось выяснить, что функция учетных данных Fn действительно дозвонилась на POST запроса, с правильным Params, а функция возвращает правильный (с проверкой подлинности) результата.

Этот http-handler используется в качестве такого

(defn run-web-server [& [port]] 
    (let [port (Integer. (or port (env :port) 10555))] 
    (print "Starting web server on port" port ".\n") 
    (run-jetty http-handler {:port port :join? false}))) 

(defn run-auto-reload [& [port]] 
    (auto-reload *ns*) 
    (start-figwheel)) 

(defn run [& [port]] 
    (when is-dev? 
    (run-auto-reload)) 
    (run-web-server port)) 

Для чего это стоит, вот мои маршруты.

(defroutes routes 
    (GET "/" req 
    (h/html5 
     misc/pretty-head 
     (misc/pretty-body 
     (misc/github-link req) 
     [:h3 "Current Status " [:small "(this will change when you log in/out)"]] 
     [:p (if-let [identity (friend/identity req)] 
      (apply str "Logged in, with these roles: " 
       (-> identity friend/current-authentication :roles)) 
      "anonymous user")] 
     login-form 
     [:h3 "Authorization demos"] 
     [:ul 
     [:li (e/link-to (misc/context-uri req "role-user") "Requires the `user` role")]] 
     [:p (e/link-to (misc/context-uri req "logout") "Click here to log out") "."]))) 
    (GET "/login" req 
    (h/html5 misc/pretty-head (misc/pretty-body login-form))) 
    (GET "/logout" req 
    (friend/logout* (resp/redirect (str (:context req) "/")))) 
    (GET "/role-user" req 
    (friend/authorize #{::users/user} "You're a user!"))) 
+0

Я понял. '(wrap api-defaults)' не разрешает сеансы, а Friend пытается их использовать. Вместо этого я должен использовать параметры сайта. Дополнительную информацию см. В [ring middleware] (https://github.com/ring-clojure/ring-defaults). – currentoor

+1

Опубликуйте это как ответ, который вы можете принять, поэтому этот вопрос больше не остается без ответа. – schaueho

ответ

1

Я понял. (wrap api-defaults) не разрешает сеансы, а Friend пытается их использовать. Вместо этого я должен использовать site-defaults. См. ring middleware для получения дополнительной информации.