Hi Jérôme -

Happy to see you here!
I apologize for having missed your note on the list a few days ago.

Glad to see that the article was helpful and it seems like you are making
great progress.

Let me dig into your note a bit deeper and answer your questions.

Welcome!

--larry

On Tue, Nov 10, 2015 at 11:14 AM, Jérôme LELEU <[email protected]> wrote:

> Hi,
>
> Perfect timing ;-) I have started implemented the pac4j support in Knox,
> it's a very basic attempt: https://github.com/apache/knox/pull/2/files
>
> This implementation reuses the pac4j implementation for J2E. I have a
> ProviderDeploymentContributorBase which registers two filters:
> - the first one is a dispatcher filter which uses the j2e-pac4j
> CallbackFilter on the /callabck url (it finishes the authentication process
> after a successful authentication at some identity provider) and uses the
> j2e-pac4j RequiresAuthenticationFilter otherwise (redirection to the
> identity provider to start the authentication when the user is not
> authenticated)
> - the second one is an identity adapter which gets the current
> authenticated user from the pac4j point of view and populates the J2E
> security context.
>
>
> * I have the following error:
>
> 2015-11-10 16:30:22,347 ERROR hadoop.gateway
> (GatewayFilter.java:doFilter(135)) - Gateway processing failed:
> javax.servlet.ServletException: javax.servlet.ServletException:
> Authentication type must be specified: simple|kerberos|<class>
> javax.servlet.ServletException: javax.servlet.ServletException:
> Authentication type must be specified: simple|kerberos|<class>
>         at
> org.apache.hadoop.gateway.GatewayFilter$Holder.getInstance(GatewayFilter.java:354)
>
> Notice I have changed the sandbox.xml file to use pac4j instead of Shiro,
> maybe it's not the right way:
> https://github.com/apache/knox/pull/2/files#diff-128ca80baa2dfd6c2d25de7b8160b9d9R24
>
> Any idea of the problem?
>
>
> * Am I understanding webflows correctly?
>
> I use the default request to: curl -ivk "
> https://localhost:8443/gateway/sandbox/webhdfs/v1/tmp?op=LISTSTATUS";
>
> It looks like a REST request, though I'm expecting the following webflow:
> redirection of the user to the identity provider, successful login,
> redirection back to the /callback url of the gateway: do I get it right?
>
>
> * The callback url
>
> I currently do a check expecting the last part of the url to end with
> /callback, but does the gateway will receive requests on this url? Do I
> have to do something special?
>
> It's highly recommended to only have one callback url as this url is
> defined on the identity provider side.
>
>
> * How to pass configuration?
>
> Currently, I hardcoded a FacebookClient for Facebook authentication, but
> we should be able to pass the appropriate client like Facebook or SAML.
> Basically, we could do that using filter properties: facebook.key +
> facebook.secret means we use Facebook authentication with the appropriate
> key and secret for example. Any recommendation?
>
>
> * Can I use the J2E session to store the requested protected url and other
> information?
>
> Or do I need to do something special?
>
>
> Thanks.
> Best regards,
> Jérôme
>
> 2015-11-10 17:03 GMT+01:00 Kevin Minder <[email protected]>:
>
>> Hi Jerome,
>> This sounds very exciting and is just the sort of thing the open
>> architecture of Knox is intended to allow.  Larry and I have looked at
>> pac4j a number of times thinking that it would be a good fit and would
>> provide a great feature set to the Hadoop community.
>> Kevin.
>>
>>
>>
>> On 11/6/15, 3:31 AM, "Jérôme LELEU" <[email protected]> wrote:
>>
>> >Hi,
>> >
>> >Let's open this private discussion on the Knox dev mailing list.
>> >
>> >I'm Jerome Leleu and the creator of pac4j (
>> https://github.com/pac4j/pac4j),
>> >a security engine for Java with many implementations for J2E, Play,
>> Spring,
>> >Vertx, Ratpack... The idea is to offer something as powerful as Spring
>> >Security, but a lot easier and for all Java frameworks / tools and all
>> >authentication mechanisms.
>> >
>> >Two years ago, we had a discussion with Larry on how pac4j could be used
>> in
>> >Knox.
>> >
>> >Meanwhile, both projects have grown up and I'm back to try to see if
>> pac4j
>> >can help Knox in terms of security.
>> >
>> >-----
>> >
>> >In its latest version, pac4j can be used to build a full security
>> library,
>> >not only focused on delegated authentication (Facebook, SAML). So we have
>> >the concepts of direct clients (a client is an authentication mechanism):
>> >basic auth, header, token... and indirect clients: SAML, Facebook,
>> OpenID,
>> >CAS...
>> >It seems to be very close to the Authentication and Federation Providers
>> >concepts from Knox.
>> >
>> >The provided article is great and as it's focused on authentication with
>> a
>> >real example, it's easier to start with it.
>> >
>> >Thanks for your answers.
>> >
>> >Like Shiro, pac4j has LDAP support and caching can be done. The only
>> >difference is that pac4j relies on ldaptive (http://www.ldaptive.org/).
>> But
>> >I think you're right: it would be better to start by implementing the
>> >Federation part which might be the most expected feature for Knox users
>> (a
>> >bit like buji-pac4j: https://github.com/bujiio/buji-pac4j is for Shiro)
>> and
>> >see if it's worth the work to have an authentication provider with pac4j
>> in
>> >addition to the one of Shiro.
>> >
>> >I plan to start working on that next week. Do you accept pull requests on
>> >Github (it would make discussion easier on source code)?
>> >
>> >Any feedback will be appreciated.
>> >
>> >Thanks.
>> >Best regards,
>> >Jérôme
>> >
>> >
>> >
>> >
>> >
>> >
>> >2015-11-05 17:13 GMT+01:00 larry mccay:
>> >
>> >> Hi Jérôme -
>> >>
>> >> Contributions coming from the community are owned and maintained by the
>> >> entire community.
>> >> You would certainly not be expected to do all work on it and at the
>> same
>> >> time any assistance and upgrade messages that you provided would be
>> awesome.
>> >>
>> >> As for an empty module for pac4j, maybe the following example project
>> >> would be helpful to you:
>> >>
>> >> https://github.com/lmccay/gateway-provider-security-pseudo
>> >>
>> >> It is in support of an article to illustrate how to go about adding a
>> >> authentication or federation provider - as you would be doing:
>> >>
>> >>
>> https://github.com/lmccay/gateway-provider-security-pseudo/blob/master/AddingFederationProvider.md
>> >>
>> >> That may be easier to consume than the entire developers guide.
>> >> That said, it would be great if you could describe what makes the dev
>> >> guide too much - if that is the case.
>> >>
>> >> I'll take a stab at your questions here but we should move more
>> detailed
>> >> discussions on the topic to the dev@ list in order to keep this in the
>> >> open and provide insights to others:
>> >>
>> >> 1) What do I do with the authenticated user: where / how do I fill this
>> >> identity in Knox?
>> >>
>> >> We normalize the authentication event into a Java subject to represent
>> the
>> >> user, groups and impersonated user as appropriate.
>> >> In cases - like shiro - where we don't have access to the actual
>> >> authenticating code and we need to normalize the provider specific
>> security
>> >> context, we add another filter. You can look at the shiro provider for
>> an
>> >> example. The code inside the simple example provider in the article
>> also
>> >> shows what is expected at least in terms of the PrimaryPrincipal.
>> >>
>> >> 2) How to handle errors: not authenticated, not authorized?
>> >>
>> >> We aren't intrusive on what should be done by a provider here.
>> >> Generally, authentication failures result in a 401 and authorizations
>> in a
>> >> 403 and they are usually sent by the provider.
>> >>
>> >> 3) How to handle redirections to an external provider?
>> >>
>> >> Redirects are sent by the providers themselves with a 307 or 302.
>> >> You can look at the SSOCookieFederationFilter in the jwt module as an
>> >> example if you like.
>> >>
>> >> 4) Should the pac4j filter also handle authorizations (pac4j can do
>> that)?
>> >>
>> >> This is an interesting question.
>> >> Knox provides a separate slot in the provider chain for authorization.
>> >> It is there because of the ability for identity assertion providers to
>> map
>> >> principals in order to impersonate another user or map external
>> usernames
>> >> to those used inside of hadoop clusters. So, the authorization
>> decisions
>> >> are made based on those identities.
>> >>
>> >> If we can add the authorization filter as an authorization provider
>> rather
>> >> than part of the authentication provider than that might make sense.
>> >> Although, the security context is normalized as Knox expects not as
>> pac4j
>> >> authorization probably does. Now, if there is real value in doing so,
>> the
>> >> pac4j Subject adaptor could stuff additional context into the Subject
>> or
>> >> the request that can be accessed later by the pac4j authorization
>> provider.
>> >>
>> >> So, it can be done - the question is whether there is compelling
>> reason to
>> >> do so.
>> >>
>> >> 5) How to test?
>> >>
>> >> This can be challenging especially for external authentications and web
>> >> app flows.
>> >> Generally, unit testing as much as possible is required.
>> >> We would want to make sure that the security context normalization
>> happens
>> >> as expected, etc.
>> >>
>> >> Additional considerations:
>> >>
>> >> 1. Our Shiro provider does group lookup and caching of the
>> authentication
>> >> event for optimizing interactions with authentication servers, LDAP,
>> AD,
>> >> etc. We wouldn't want to lose these. Doing so would be a non-starter
>> for
>> >> most folks replacing what Shiro is used for today.
>> >> 2. It is probably best to concentrate on the gaps that pac4j can fill
>> for
>> >> openid, oauth, etc for the initial contribution and if the usecases
>> handled
>> >> by Shiro can be done better, easier, simpler then we can consider a
>> >> migration path.
>> >>
>> >> BTW - we have a couple very interesting possibilities for strong and
>> >> multi-factor authentication that would be enabled by OpenID
>> immediately.
>> >>
>> >> Hope this isn't too long a response and that it is helpful for you.
>> >>
>> >> Let's determine what an initial contribution would be for and bring a
>> >> proposal to the dev@ list and/or file a jira for the integration.
>> >> This would be great for adding features and growing the community - so
>> we
>> >> are all for it!
>> >>
>> >> thanks,
>> >>
>> >> --larry
>> >>
>> >>
>> >> On Thu, Nov 5, 2015 at 9:43 AM, Jérôme LELEU <[email protected]> wrote:
>> >>
>> >>> Hi,
>> >>>
>> >>> I see that Shiro is already used for basic auth and LDAP
>> authentication
>> >>> and Picketlink for SAML. pac4j v1.8 can now handle both cases and even
>> >>> more. So I think we could create a gateway-provider-security-pac4j
>> >>> supporting all authentication mechanisms and not only OpenID.
>> >>>
>> >>> pac4j implementations generally work with two filters: one to protect
>> a
>> >>> resource and play direct authentication like basic auth (and check
>> >>> authorizations) and a callback filter to finish remote authentication
>> like
>> >>> Facebook, SAML, OpenID. The easiest one is the j2e-pac4j with:
>> >>>
>> https://github.com/pac4j/j2e-pac4j/blob/master/src/main/java/org/pac4j/j2e/filter/RequiresAuthenticationFilter.java#L96
>> >>> and
>> >>>
>> https://github.com/pac4j/j2e-pac4j/blob/master/src/main/java/org/pac4j/j2e/filter/CallbackFilter.java#L65
>> >>>
>> >>> That said, I have already many pac4j implementations to handle so I'm
>> >>> pushing communities to maintain on their own their pac4j
>> implementations:
>> >>> can we imagine having an official: gateway-provider-security-pac4j
>> module
>> >>> maintained by the Knox community with my help of course? This is the
>> kind
>> >>> of message I deliver to communities when a new version of pac4j is
>> >>> available so that they can upgrade:
>> >>> https://github.com/ratpack/ratpack/issues/819
>> >>>
>> >>> I read:
>> https://knox.apache.org/books/knox-0-6-0/dev-guide.html#Providers,
>> >>> it might be easy for Knox contributors, but it's a bit hard for me to
>> get
>> >>> in everything: can you or someone in the Knox community provides me an
>> >>> empty gateway-provider-security-pac4j module and the default
>> expectations
>> >>> from a Knox point of view?
>> >>> My main questions:
>> >>> 1) What do I do with the authenticated user: where / how do I fill
>> this
>> >>> identity in Knox?
>> >>> 2) How to handle errors: not authenticated, not authorized?
>> >>> 3) How to handle redirections to an external provider?
>> >>> 4) Should the pac4j filter also handle authorizations (pac4j can do
>> that)?
>> >>> 5) How to test?
>> >>>
>> >>> Thanks.
>> >>> Best regards,
>> >>> Jérôme
>> >>>
>> >>>
>> >>>
>> >>>
>> >>> 2015-11-03 16:58 GMT+01:00 larry mccay:
>> >>>
>> >>>> Hi Jérôme -
>> >>>>
>> >>>> We were evaluating buji-pac4j for SSO with SAML and ended up going
>> with
>> >>>> Picketlink at the time.
>> >>>> That said, we do have a pluggable architecture that would allow for a
>> >>>> pac4j provider as well.
>> >>>>
>> >>>> If you are interested in contributing such a provider that would
>> >>>> certainly be welcome.
>> >>>> There is someone in the community working on an openid provider but
>> >>>> perhaps pac4j would be the way to go there?
>> >>>>
>> >>>> thanks,
>> >>>>
>> >>>> --larry
>> >>>>
>> >>>>
>>
>
>

Reply via email to