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