Yes, Kevin, that seems to be missing from the pull request. Also, the parent pom doesn't have all of the changes needed to add a new module.
See the section in the article called "Root Level Pom.xml" and the section below that for the "Gateway Release Module Pom.xml" https://github.com/lmccay/gateway-provider-security-pseudo/blob/master/AddingFederationProvider.md#root-level-pomxml On Thu, Nov 12, 2015 at 8:04 AM, Kevin Minder <kevin.min...@hortonworks.com> wrote: > I think I know what it probably is. The gateway-release module pom.xml is > what actually defines the classpath of the final packaged server. If you > take a look at that you will see it references all of the providers that > are intended to be included by default. Try adding yours to the > dependencies. > > > > > On 11/12/15, 7:49 AM, "larry mccay" <lmc...@apache.org> wrote: > > >We really need to fix this behavior... > > > >It seems you traded in your random authentication provider for a random > >federation provider. :/ > > > >This is most likely due to not having your new provider on the classpath > >for the serviceLoader to find. > > > >Just to try and articulate how it works... > > > >The deployment machinery loads all of the federation (whichever role) > >providers contributors that is finds on the classpath - via the > > >src/main/resources/META-INF/services/org.apache.hadoop.gateway.deploy.ProviderDeploymentContributor > >- and interrogates each for its name to match to the name in the topology. > >Once it finds a match it allows the contributor to "contribute" to the > >creation of the topology specific webapp. Part of which includes adding > >filters to the gateway.xml. > > > >We currently have an issue wherein, given a name that doesn't match any > >found on the classpath, a random provider is returned. This needs to be > >fixed to fail deployment with appropriate error messages. > > > >Now, this usually comes down to one of 2 things: > > > >1. there is no > src/main/resources/META-INF/services/org.apache.hadoop.gateway.deploy.ProviderDeploymentContributor > >file in the provider or it contains the classname of some other > contributor > >2. the provider itself isn't on the gateway classpath. I see that your > >service file seems to be defined properly - so it is probably not on the > >classpath. Did you add the new provider to the parent pom? The article > >should provide all you need to do so. > > > >I will file a JIRA to fix the random provider issue. > > > >On Thu, Nov 12, 2015 at 7:18 AM, Jérôme LELEU <lel...@gmail.com> wrote: > > > >> Hi, > >> > >> By changing the role to the appropriate value, the error is gone, but I > >> have a new problem: > >> > >> *Caused by: javax.servlet.ServletException: Required authentication > >> provider URL is missing.* > >> * at > >> > >> > org.apache.hadoop.gateway.provider.federation.jwt.filter.SSOCookieFederationFilter.init(SSOCookieFederationFilter.java:90)* > >> > >> My sandbox.xml file only references the pac4j provider as well as the > >> Default (role: identity-assertion) and static (role: hostmap) ones. > >> > >> Though, the SSOCookieFederationFilter is defined in the gateway.xml > file of > >> my sandbox deployment. Why do I need it? What's the expected > authentication > >> provider url? How this gatweay.xml is generated? > >> > >> Thanks. > >> Best regards, > >> Jérôme > >> > >> > >> > >> > >> > >> 2015-11-10 17:36 GMT+01:00 Kevin Minder <kevin.min...@hortonworks.com>: > >> > >> > 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" <lmc...@apache.org> 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 <lmc...@apache.org> > >> 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 <lel...@gmail.com> > >> > 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 < > >> kevin.min...@hortonworks.com > >> > >: > >> > >>> > >> > >>>> 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" <lel...@gmail.com> 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 < > lel...@gmail.com> > >> > >>>> 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 > >> > >>>> >>>> > >> > >>>> >>>> > >> > >>>> > >> > >>> > >> > >>> > >> > >> > >> > > >> >