Good catch. Will test with the right role... 2015-11-10 17:36 GMT+01:00 Kevin Minder <[email protected]>:
> To be a bit more explicit your Pac4jFederationProviderContributor declares > itself to be of role “federation” but when you used it in the sandbox.xml > topology file you were attempting to configure it as an provider with role > authentication. > > > > > On 11/10/15, 11:32 AM, "larry mccay" <[email protected]> wrote: > > >Let's get you past the error that you are getting... > > > >It seems as though you have change the topology for pac4j but didn't > change > >the role to "federation". > >It looks like it is grabbing a random authentication provider and seems to > >be the hadoop-auth provider. > > > >Change that to federation and see if that helps. > > > >On Tue, Nov 10, 2015 at 11:21 AM, larry mccay <[email protected]> wrote: > > > >> 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 > >>>> >>>> > >>>> >>>> > >>>> > >>> > >>> > >> >
