If your service map already includes the key
:io.pedestal.http/interceptors when you call one of the create-
functions, then Pedestal won’t add the default interceptors. So what
should you do if you want to use the default interceptors, but want to
add your own interceptors to the default stack?
The solution is to call
api:default-interceptors[]
yourself, before calling create-server
or create-servlet
. That
way, default-interceptors
can build the default stack, then your
application code has an opportunity to modify it. By the time you call
create-server
or create-servlet
, the
:io.pedestal.http/interceptors key will have your modified version
of the default interceptors.
Here is an example of adding interceptors to perform authentication
and authorization on every request. (Assuming we have a namespace
auth
with functions to construct these interceptors given a
configuration.)
(defn service
[service-map authn-config authz-config]
(-> service-map
(http/default-interceptors) (1)
(update ::http/interceptors conj (auth/authentication-interceptor authn-config)) (2)
(update ::http/interceptors conj (auth/authorization-interceptor authz-config)) (3)
(http/create-server))) (4)
1 | Attach the default interceptors to our service map |
2 | Modify the defaults to add authentication. |
3 | modify the defaults to add authorization. |
4 | Create the server as usual. This would normally attach the defaults, but will skip that because we’ve set them up ourselves. |