Как реализовать аутентификацию пользователя с помощью clojure-liberator?

Я не совсем понимаю https://github.com/clojure-liberator/liberator и список решений, которые он предоставляет разработчику. Как реализовать базовую службу аутентификации / аутентификации, используя / рядом с / поверх библиотеки?

2 ответа

Решение

Из файла "

Ресурсы совместимы с Ring и могут быть обернуты в промежуточное ПО Ring. При оценке ресурс возвращает функцию, которая принимает запрос Ring и возвращает ответ Ring.

так что вы можете обернуть его в кольцевой аутентификации

(use 'ring.middleware.basic-authentication)
(defn authenticated? [name pass] (and (= name "foo") (= pass "bar")))
(def app (-> routes .. (wrap-basic-authentication authenticated?))

Идиоматический способ заключается в реализации :authorized? точка принятия решения. Однако в настоящее время не поддерживается обработка базовой или дайджест-аутентификации. Практический подход заключается в использовании ring-basic-authentication для аутентификации и обработки только авторизации в ресурсе. В следующем примере используется ring-basic-authentication и задается токен для роли пользователя. Эта роль затем проверяется освободителем в authorized?

(defresource admin-only
  :handle-ok "secrect"
  :handle-unauthorized "for admins only"
  :authorized? (fn [{{token :token} :request}]
                 (= "admin" token)))

;; token returned encodes role
(defn authenticated? [name pass] 
  (cond (and (= name "scott") 
             (= pass "tiger")) "admin")
        (and (= name "jack")
             (= pass "jill"))  "user)))

(def app (wrap-basic-authentication admin-only authenticated?))
Другие вопросы по тегам