Frage Wie implementiert man Benutzerauthentifizierung mit Clojure-Befreier?


Ich verstehe nicht wirklich https://github.com/clojure-liberator/liberator und die Liste der Entscheidungspunkte, die es dem Entwickler zur Verfügung stellt. Wie würde man einen Basis-Auth / Auth-Dienst implementieren, der / neben / auf der Oberseite der Bibliothek verwendet?


8
2017-12-04 11:36


Ursprung


Antworten:


aus der Readme "

Ressourcen sind mit Ring kompatibel und können in Ring-Middleware eingebunden werden. Wenn eine Ressource ausgewertet wird, gibt sie eine Funktion zurück, die eine Ringanforderung annimmt und eine Ringantwort zurückgibt.

so können Sie es dann einwickeln Ring-Basis-Authentifizierung

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

6
2017-12-04 18:08



Der idiomatische Weg ist die Umsetzung der :authorized? Entscheidungspunkt. Derzeit gibt es jedoch keine Unterstützung für die Behandlung der Basis- oder Digest-Authentifizierung. Ein praktischer Ansatz ist zu verwenden ring-basic-authentication zur Authentifizierung und behandelt nur die Autorisierung in der Ressource. Das folgende Beispiel verwendet die Ring-Basis-Authentifizierung und setzt das Token auf die Rolle eines Benutzers. Diese Rolle wird dann von liberator in überprüft 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?))

14
2018-01-06 21:55