BTW, Just for completeness, I cannot subclass any of the DropWizard
provided AuthFilters as all of them have private constructors only. I am
trying all your suggestions by extending AuthFilter directly.
On Thursday, July 14, 2016 at 12:06:33 AM UTC+5:30, Saumitra Bhave wrote:
>
> understood. but then my problem remains unsolved, let me elaborate the
> problem again,
>
> Basically I want to authorize the user based on PathParams, to take this
> decision, I need 3 things at one place 1. The Principal 2. PathParams 3.
> Roles to check against (Provided via annotations)
>
> With the suggested code, I can look at the PathParams in my subclassed
> authenticate but I neither have the Principal nor the Role to check
> against. One solution is to put PathParams into my principal subclass, so
> that its available to me inside authorizer.authorize, but looks kind of
> hacky.
>
> On Wednesday, July 13, 2016 at 10:49:17 AM UTC+5:30, Evan Meagher wrote:
>>
>> AuthFilter instances are shared by all application threads within a
>> Dropwizard server, so they need to be thread-safe. Reassigning
>> `authenticator` within the `filter` method would risk leaking
>> `ContainerRequestContext`s across threads handling different requests.
>>
>> All your AuthFilter subclass should have to do is override the
>> `authenticate` method to inspect the request context before passing through
>> to `super.authenticate`:
>>
>> public class PathInspectingBasicAuthFilter<P extends Principal>
>> extends BasicCredentialAuthFilter<String, P> {
>> @Override
>> protected boolean authenticate(ContainerRequestContext
>> requestContext, C credentials, String scheme) {
>> // Inspect the PathParams within `requestContext` and maybe
>> return false.
>> ...
>>
>> return super.authenticate(requestContext, credentials, scheme);
>> }
>> }
>>
>> Note that I took the liberty of extending `BasicCredentialAuthFilter`,
>> since based on your example you appear to be using basic auth.
>>
>> On Tue, Jul 12, 2016 at 9:22 PM, Saumitra Bhave <[email protected]>
>> wrote:
>>
>>> Hi Evan:
>>>
>>> Thanks a lot for your help, I got the idea from your post but not sure
>>> if I implemented it right, following is what I have done based your
>>> suggestion.
>>>
>>> RequestAwareAuthFilter.java
>>> "
>>>
>>>
>>> public class RequestAwareAuthFilter<P extends Principal> extends
>>> AuthFilter<String, P> {
>>>
>>> private AuthenticatorFactory<String, P> authFactory;
>>>
>>> private RequestAwareAuthFilter(AuthenticatorFactory<String, P>
>>> authFactory) {
>>> this.authFactory = authFactory;
>>> }
>>>
>>> @Override
>>> public void filter(final ContainerRequestContext requestContext) throws
>>> IOException {
>>> final String credentials =
>>> getCredentials(requestContext.getHeaders().getFirst(HttpHeaders
>>> .AUTHORIZATION));
>>>
>>>
>>> authenticator = authFactory.get(requestContext);
>>>
>>>
>>> if (!authenticate(requestContext, credentials,
>>> SecurityContext.BASIC_AUTH)) {
>>> throw new
>>> WebApplicationException(unauthorizedHandler.buildResponse(prefix, realm));
>>> }
>>> }
>>>
>>> @Nullable
>>> private String getCredentials(String header) { ... }
>>>
>>> public interface AuthenticatorFactory<C, P extends Principal> {
>>> Authenticator<C, P> get(ContainerRequestContext requestContext);
>>> }
>>> }
>>>
>>> "
>>> Does that make sense? Basically its very much inspired by the existing
>>> OAuthFilter, but in this case, the builder provides a way to set
>>> 'authenticator factory' instead of a singleton authenticator, then I create
>>> a new Authenticator with request context in each filter call.
>>>
>>> This allows me to inject the same request context into the Principal
>>> subclass inside 'Authenticator.authenticate(credentials)'
>>>
>>> Is this the best way to achieve what I need? or am I over engineering
>>> things here?
>>>
>>> Thanks again,
>>> Saumitra
>>>
>>> On Tuesday, July 12, 2016 at 8:06:47 AM UTC+5:30, Evan Meagher wrote:
>>>>
>>>> Can you provide relevant snippets of your code, please? If you're using
>>>> AuthDynamicFeature, then you're presumably still creating an AuthFilter to
>>>> pass to its constructor. In which case you still have access to the
>>>> `ContainerRequestContext` within `AuthFilter.authenticate`.
>>>>
>>>> If you're relying on an AuthFilterBuilder to create a filter for use
>>>> with AuthDynamicFeature, then perhaps you can simply manually create an
>>>> AuthFilter subclass in order to regain access to
>>>> `ContainerRequestContext`s.
>>>>
>>>> On Mon, Jul 11, 2016 at 1:28 PM, Saumitra Bhave <[email protected]>
>>>> wrote:
>>>>
>>>>> I just moved from custom AuthFilter to dropwizard's authentication
>>>>> Feature, One problem I am facing is that I can not access "PathParams" in
>>>>> the authorize method.
>>>>>
>>>>> Basically, my requirement is simple, in that, For Eg. User A has
>>>>> signed in and he has access to modify user B, I have this information
>>>>> stored in the UserPrincipal at the time of authenticate call. Now, I want
>>>>> A
>>>>> to be able to access PUT /users/A and PUT /users/B but not anything else.
>>>>>
>>>>> In the custom implementation, I used to store
>>>>> UriInfo.getPathParameters() into the security context, and I could use
>>>>> user
>>>>> principal and the Path together to resolve complex Authorization queries.
>>>>>
>>>>> Is there anyway I can achieve the same using DropWizard's
>>>>> AuthDynamicFeature?
>>>>>
>>>>> Regards,
>>>>> Saumitra
>>>>>
>>>>> --
>>>>> 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.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Evan Meagher
>>>>
>>> --
>>> 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.
>>>
>>
>>
>>
>> --
>> Evan Meagher
>>
>
--
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.