This commit is contained in:
Tommi Reiman 2017-08-15 10:16:25 +03:00
parent 7cd4c62216
commit 0de9e1b3c6

View file

@ -122,29 +122,26 @@
respond (partial reset! result), raise ::not-called]
(app {:uri "/api/users" :request-method :post} respond raise)
(is (= {:status 200, :body [:api :users :post :ok :post :users :api]}
@result))))))
@result)))))))
(testing "runtime extensions for meta-data"
(let [enforce-roles (fn [handler]
(defn wrap-enforce-roles [handler]
(fn [{:keys [::roles] :as request}]
(let [required (some-> request
(ring/get-match)
:meta
::roles)]
(if (or (not (seq required))
(set/intersection required roles))
(handler request)
{:status 403 :body "forbidden"}))))
router (ring/router
(let [required (some-> request (ring/get-match) :meta ::roles)]
(if (and (seq required) (not (set/intersection required roles)))
{:status 403, :body "forbidden"}
(handler request)))))
(deftest enforcing-meta-data-rules-at-runtime-test
(let [handler (constantly {:status 200, :body "ok"})
app (ring/ring-handler
(ring/router
[["/api"
["/ping" handler]
["/admin" {::roles #{:admin}}
["/ping" handler]]]]
{:meta {:middleware [enforce-roles]}})
app (ring/ring-handler router)]
{:meta {:middleware [wrap-enforce-roles]}}))]
(testing "public handler"
(is (= {:status 200, :body [:ok]}
(is (= {:status 200, :body "ok"}
(app {:uri "/api/ping" :request-method :get}))))
(testing "runtime-enforced handler"
@ -153,7 +150,7 @@
(app {:uri "/api/admin/ping"
:request-method :get}))))
(testing "with needed roles"
(is (= {:status 200, :body [:ok]}
(is (= {:status 200, :body "ok"}
(app {:uri "/api/admin/ping"
:request-method :get
::roles #{:admin}}))))))))
::roles #{:admin}})))))))