Я несколько дней боролся, пытаясь получить простое использование библиотеки безопасности, Друг, для работы с шаблоном 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!")))
Я понял. '(wrap api-defaults)' не разрешает сеансы, а Friend пытается их использовать. Вместо этого я должен использовать параметры сайта. Дополнительную информацию см. В [ring middleware] (https://github.com/ring-clojure/ring-defaults). – currentoor
Опубликуйте это как ответ, который вы можете принять, поэтому этот вопрос больше не остается без ответа. – schaueho