Our current workaround is to explicitly pass the value around, so I'm happy
going back that way. It's mostly working fine, except I have to register a
filter at runtime:
public void doMyThing(MyPrincipalClass auth) {
WebTarget wt = jerseyClient.target("the twirp url").build()).register(new
ClientRequestFilter() {
@Override
public void filter(ClientRequestContext requestContext) throws
IOException {
requestContext.getHeaders().add(JWT_HEADER_NAME, auth.getHeader());
}
});
}
Registering that filter at runtime causes the client's stack of filters and
what not to be cloned and appears to have a concurrency bug which leads to
sporadic errors.
I need to register a filter rather than just inject the header to the
Invocation so I can pass a WebTarget (with associated headers) to the Twirp
library we're using.
So I can see that ClientRequestContext has a 'getProperty', is there a way
for me to pass set that property on a given WebTarget?
On Friday, 26 October 2018 09:36:13 UTC+13, Steve Kradel wrote:
>
> You'll want to register a filter on the Dropwizard/Jersey Client object
> (not environment.jersey() which is the "server"). Actually tracking the
> client's security context can be a little tricky--use a ThreadLocal as you
> mentioned, or, to preserve sanity in potentially async/multithreaded cases,
> pass around the Principal as a value and wire to each outgoing request as
> needed. FWIW I am not a fan of ThreadLocal for security properties.
>
> On Wednesday, October 24, 2018 at 10:56:50 PM UTC-4, Michael Koziarski
> wrote:
>>
>> Hi,
>>
>> We have a dropwizard 1.1 service which authenticates inbound requests
>> using dropwizard-auth and I'm hoping to get access to that Principal in
>> classes which aren't resources. The tl;dr for why, is we have our own
>> internal authentication mechanism which retrieves a token from an http
>> header and needs to pass a variant of that header back out on any outbound
>> requests it makes to other services. Unfortunately I basically have no
>> idea how the jersey injection works... At all.
>>
>> What I'm *hoping* to be able to do is register a ClientRequestFilter
>> which will thread the Principal from the inbound HttpServletRequest through
>> to the outbound jersey client request. Something like:
>>
>> ```
>> public class AuthenticationContextInjectionFilter implements
>> ClientRequestFilter {
>> public static final String OUTBOUND_HEADER_NAME = "Some-Thing";
>>
>> @Inject // Or is it @Context?
>> private Provider<MyPrincipalClass> principal; // Have also tried
>> Provider<Principal>
>>
>> @Override
>> public void filter(ClientRequestContext requestContext) throws
>> IOException {
>> final MyPrincipalClass principalVal = this.principal.get();
>> requestContext.getHeaders().add(OUTBOUND_HEADER_NAME,
>> principalVal.getHeader());
>> }
>> }
>>
>> // and in my Application
>> environment.jersey().register(AuthenticationContextInjectionFilter.class);
>> ```
>>
>> However, it's basically always null so however jersey's injection works
>> is clearly not the way I think it works.
>>
>> Is it possible to achieve what I'm trying to do here? I can probably
>> biff the value into a ThreadLocal to work around this, but that feels a
>> little like i'm surrendering. Is there some introductory documentation I
>> could read on this stuff?
>>
>>
>>
>>
>>
--
You received this message because you are subscribed to the Google Groups
"dropwizard-user" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.