Thanks for the effort to help me, Achim.

I believe the Jetty configuration is being added automatically by PAX-Web, 
because I see it being created after the container starts, so I think that part 
is fine.
The web.xml is correctly configured too, except I am using BASIC authentication 
as opposed to Form-based, but I have the required elements:

        <security-constraint>
                <web-resource-collection>
                        <web-resource-name>Protected Area</web-resource-name>
                        <url-pattern>/*</url-pattern>
                </web-resource-collection>
                <auth-constraint>
                        <role-name>admin</role-name>
                </auth-constraint>
        </security-constraint>

        <login-config>
                <auth-method>BASIC</auth-method>
                <realm-name>Karaf</realm-name>
        </login-config>

        <security-role>
                <role-name>admin</role-name>
        </security-role>


However, I am getting the previous class not found error:

2020-05-11T12:34:29,892 | ERROR | paxweb-extender-1-thread-2 | WebAppPublisher  
                | 307 - org.ops4j.pax.web.pax-web-extender-war - 7.2.14 | Error 
deploying web application
java.lang.IllegalStateException: No LoginService for 
org.eclipse.jetty.security.authentication.BasicAuthenticator@5acaf57a in 
ConstraintSecurityHandler@6ee023ca{STARTING}


I suspect I may be missing a feature.  I have deployed:

<feature>war</feature>

Is there anything else I need to deploy?  
Shouldn’t these missing Jetty classes be deployed as part of Pax-Web?


Best regards,
Alex soto




> On May 11, 2020, at 12:16 PM, Achim Nierbeck <[email protected]> wrote:
> 
> Hi Alex, 
> 
> a wab is nothing else then a war which is already contains the required 
> Web-ApplicationContext parameter. 
> That's the only difference, and the sample is actually the same ;) 
> 
> Needed to look this up from the "Apache Karaf Cookbook" :) (it's been a while 
> I did write this and the code in pax-web) 
> First you need to configure your web-container to use the jaas service of the 
> surrounding Karaf. 
> For Jetty this is something like the following: 
> 
> https://github.com/ops4j/org.ops4j.pax.web/blob/90ca0dab311c78bfc2c39655547a7dcfd90d3ad4/pax-web-itest/pax-web-itest-karaf/src/test/resources/jetty.xml#L53-L65
>  
> <https://github.com/ops4j/org.ops4j.pax.web/blob/90ca0dab311c78bfc2c39655547a7dcfd90d3ad4/pax-web-itest/pax-web-itest-karaf/src/test/resources/jetty.xml#L53-L65>
> 
>     <Call name="addBean">
>         <Arg>
>             <New class="org.eclipse.jetty.jaas.JAASLoginService">
>                 <Set name="name">karaf</Set>
>                 <Set name="loginModuleName">karaf</Set>
>                 <Set name="roleClassNames">
>                     <Array type="java.lang.String">
>                         
> <Item>org.apache.karaf.jaas.boot.principal.RolePrincipal</Item>
>                     </Array>
>                 </Set>
>             </New>
>         </Arg>
>     </Call>
> 
> Second, you need to configure this realm in your WAB/WAR with its 
> corresponding web.xml: 
> 
> https://github.com/ops4j/org.ops4j.pax.web/blob/90ca0dab311c78bfc2c39655547a7dcfd90d3ad4/samples/war-formauth/src/main/webapp/WEB-INF/web.xml#L98-L119
>  
> <https://github.com/ops4j/org.ops4j.pax.web/blob/90ca0dab311c78bfc2c39655547a7dcfd90d3ad4/samples/war-formauth/src/main/webapp/WEB-INF/web.xml#L98-L119>
> 
> <security-constraint>
> <web-resource-collection>
> <web-resource-name>Protected Area</web-resource-name>
> <description>Protect the Example Servlet</description>
> <url-pattern>/wc/example</url-pattern>
> </web-resource-collection>
> <auth-constraint>
> <description>Authorized Users Group</description>
> <role-name>admin</role-name>
> </auth-constraint>
> </security-constraint>
> <login-config>
> <auth-method>FORM</auth-method>
> <form-login-config>
> <form-login-page>/login.jsp</form-login-page>
> <form-error-page>/loginError.jsp</form-error-page>
> </form-login-config>
> </login-config>
> <security-role>
> <description>Test Role</description>
> <role-name>admin</role-name>
> </security-role>
> 
> best regards, Achim 
> 
> P.S. here is the sample from the Apache Karaf Cookbook: 
> https://github.com/jgoodyear/ApacheKarafCookbook/tree/master/chapter4/chapter4-recipe7
>  
> <https://github.com/jgoodyear/ApacheKarafCookbook/tree/master/chapter4/chapter4-recipe7>
> Am Mo., 11. Mai 2020 um 15:17 Uhr schrieb Alex Soto <[email protected] 
> <mailto:[email protected]>>:
> Ok, I am not having good luck with this. Using the realm “karaf” and BASIC 
> authentication.  
> Mind that my artifact is a WAB, not a WAR.
> 
> My web.xml
> 
>       <security-constraint>
>               <web-resource-collection>
>                       <web-resource-name>Protected Area</web-resource-name>
>                       <url-pattern>/*</url-pattern>
>               </web-resource-collection>
>               <auth-constraint>
>                       <role-name>admin</role-name>
>               </auth-constraint>
>       </security-constraint>
> 
>       <login-config>
>               <auth-method>BASIC</auth-method>
>               <realm-name>Karaf</realm-name>
>       </login-config>
> 
>       <security-role>
>               <role-name>admin</role-name>
>       </security-role>
> 
> 
> Error:
> 
> 
> 9:13:05.881 ERROR [paxweb-extender-3-thread-2] Error deploying web application
> java.lang.IllegalStateException: No LoginService for 
> org.eclipse.jetty.security.authentication.BasicAuthenticator@22444ea2 in 
> ConstraintSecurityHandler@17b84a6e{STARTING}
>       at 
> org.eclipse.jetty.security.authentication.LoginAuthenticator.setConfiguration(LoginAuthenticator.java:92)
>  ~[?:?]
>       at 
> org.eclipse.jetty.security.SecurityHandler.doStart(SecurityHandler.java:344) 
> ~[?:?]
>       at 
> org.eclipse.jetty.security.ConstraintSecurityHandler.doStart(ConstraintSecurityHandler.java:419)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:106)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.session.SessionHandler.doStart(SessionHandler.java:504)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.ContainerLifeCycle.start(ContainerLifeCycle.java:169)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.ContainerLifeCycle.doStart(ContainerLifeCycle.java:110)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.handler.AbstractHandler.doStart(AbstractHandler.java:106)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.handler.ScopedHandler.doStart(ScopedHandler.java:120)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.handler.ContextHandler.startContext(ContextHandler.java:879)
>  ~[?:?]
>       at 
> org.eclipse.jetty.servlet.ServletContextHandler.startContext(ServletContextHandler.java:357)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.startContext(HttpServiceContext.java:396)
>  ~[?:?]
>       at 
> org.eclipse.jetty.server.handler.ContextHandler.doStart(ContextHandler.java:821)
>  ~[?:?]
>       at 
> org.eclipse.jetty.servlet.ServletContextHandler.doStart(ServletContextHandler.java:276)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.service.jetty.internal.HttpServiceContext.doStart(HttpServiceContext.java:272)
>  ~[?:?]
>       at 
> org.eclipse.jetty.util.component.AbstractLifeCycle.start(AbstractLifeCycle.java:72)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.service.jetty.internal.JettyServerImpl$1.start(JettyServerImpl.java:329)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.service.internal.HttpServiceStarted.end(HttpServiceStarted.java:1264)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.service.internal.HttpServiceProxy.end(HttpServiceProxy.java:456)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.RegisterWebAppVisitorWC.end(RegisterWebAppVisitorWC.java:405)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.model.WebApp.accept(WebApp.java:658) 
> ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher$WebAppDependencyListener.register(WebAppPublisher.java:228)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher$WebAppDependencyListener.addingService(WebAppPublisher.java:173)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher$WebAppDependencyListener.addingService(WebAppPublisher.java:129)
>  ~[?:?]
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:941)
>  ~[osgi.core-6.0.0.jar:?]
>       at 
> org.osgi.util.tracker.ServiceTracker$Tracked.customizerAdding(ServiceTracker.java:870)
>  ~[osgi.core-6.0.0.jar:?]
>       at 
> org.osgi.util.tracker.AbstractTracked.trackAdding(AbstractTracked.java:256) 
> ~[osgi.core-6.0.0.jar:?]
>       at 
> org.osgi.util.tracker.AbstractTracked.trackInitial(AbstractTracked.java:183) 
> ~[osgi.core-6.0.0.jar:?]
>       at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:318) 
> ~[osgi.core-6.0.0.jar:?]
>       at org.osgi.util.tracker.ServiceTracker.open(ServiceTracker.java:261) 
> ~[osgi.core-6.0.0.jar:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.WebAppPublisher.publish(WebAppPublisher.java:98)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.WebObserver.deploy(WebObserver.java:217)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.WebObserver$1.doStart(WebObserver.java:172)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.extender.SimpleExtension.start(SimpleExtension.java:59)
>  ~[?:?]
>       at 
> org.ops4j.pax.web.extender.war.internal.extender.AbstractExtender.lambda$createExtension$0(AbstractExtender.java:277)
>  ~[?:?]
>       at 
> java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) 
> [?:1.8.0_171]
>       at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
> [?:1.8.0_171]
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)
>  [?:1.8.0_171]
>       at 
> java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)
>  [?:1.8.0_171]
>       at 
> java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
>  [?:1.8.0_171]
>       at 
> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
>  [?:1.8.0_171]
>       at java.lang.Thread.run(Thread.java:748) [?:1.8.0_171]
> 
> 
> 
> Best regards,
> Alex soto
> 
> 
> 
> 
>> On May 11, 2020, at 8:36 AM, Alex Soto <[email protected] 
>> <mailto:[email protected]>> wrote:
>> 
>> Ok I saw it now, it was hidden:
>> 
>> <realm-name>Test Realm</realm-name>
>> 
>> 
>> Best regards,
>> Alex soto
>> 
>> 
>> 
>> 
>>> On May 11, 2020, at 8:31 AM, Alex Soto <[email protected] 
>>> <mailto:[email protected]>> wrote:
>>> 
>>> Thanks Achin and JB,
>>> 
>>> I looked at that example, but that is is WAR, and I am looking for WAB 
>>> example.  Still, in the ‘web.xml’ file there is no reference to JAAS realm. 
>>>  Where do you indicate the realm name? (I have my own realm separate from 
>>> the default Karaf one).
>>> 
>>> Actually, it is not fun having to guess all this basic stuff, and also a 
>>> productivity drain, I am sorry to say.
>>> 
>>> 
>>> Best regards,
>>> Alex soto
>>> 
>>>> On May 11, 2020, at 3:12 AM, Jean-Baptiste Onofre <[email protected] 
>>>> <mailto:[email protected]>> wrote:
>>>> 
>>>> No rush, I think it’s easier for our users to find "how to" ;)
>>>> 
>>>> Thanks !
>>>> Regards
>>>> JB
>>>> 
>>>>> Le 11 mai 2020 à 09:09, Achim Nierbeck <[email protected] 
>>>>> <mailto:[email protected]>> a écrit :
>>>>> 
>>>>> Sure .. 
>>>>> maybe I find some time during this week to create this there ;) 
>>>>> 
>>>>> regards, Achim 
>>>>> 
>>>>> p.s. this just reminds me, that those samples are also in the "Apache 
>>>>> Karaf Cookbook" :) 
>>>>> 
>>>>> Am Mo., 11. Mai 2020 um 06:32 Uhr schrieb Jean-Baptiste Onofre 
>>>>> <[email protected] <mailto:[email protected]>>:
>>>>> Maybe worth to add this in the Karaf wab example as well.
>>>>> 
>>>>> I will.
>>>>> 
>>>>> Regards
>>>>> JB
>>>>> 
>>>>>> Le 10 mai 2020 à 13:45, Achim Nierbeck <[email protected] 
>>>>>> <mailto:[email protected]>> a écrit :
>>>>>> 
>>>>>> Hi, 
>>>>>> 
>>>>>> there is a sample app for Pax-Web, which is also used in the test-suite: 
>>>>>> https://github.com/ops4j/org.ops4j.pax.web/tree/master/samples/war-authentication
>>>>>>  
>>>>>> <https://github.com/ops4j/org.ops4j.pax.web/tree/master/samples/war-authentication>
>>>>>> And actually you just need to reference the jaas of the surrounding 
>>>>>> Karaf instance in your web.xml file. 
>>>>>> 
>>>>>> regards, Achim 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> Am Fr., 8. Mai 2020 um 18:41 Uhr schrieb Alex Soto 
>>>>>> <[email protected] <mailto:[email protected]>>:
>>>>>> Hello,
>>>>>> 
>>>>>> Is there a good tutorial or documentation on how to protect a WAB (Web 
>>>>>> Application Bundle) with JAAS authentication?
>>>>>> My Karaf version is 4.2.8.  Documentation here 
>>>>>> https://karaf.apache.org/manual/latest/webcontainer 
>>>>>> <https://karaf.apache.org/manual/latest/webcontainer> is scarce, only 
>>>>>> referring to Jetty global config, (even that failed for me).  I have 
>>>>>> multiple WABs and WARs in the same Karaf container, and I don’t want to 
>>>>>> apply the same JAAS authentication to all of them.   From the comment:
>>>>>> 
>>>>>> <!-- =========================================================== -->
>>>>>>     <!-- Configure Authentication Realms -->
>>>>>>     <!-- Realms may be configured for the entire server here, or -->
>>>>>>     <!-- they can be configured for a specific web app in a context -->
>>>>>>     <!-- configuration (see $(jetty.home)/contexts/test.xml for an -->
>>>>>>     <!-- example). -->
>>>>>>     <!-- =========================================================== —>
>>>>>> 
>>>>>> It looks like is a way ($(jetty.home)/contexts/test.xml ).  But this is 
>>>>>> unclear on how to apply, and it is Jetty specific.
>>>>>> My preference is for a Jetty agnostic way, for portability reasons. 
>>>>>> (Maybe Karaf will change to Undertow in the future)
>>>>>> 
>>>>>> 
>>>>>> Best regards,
>>>>>> Alex soto
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> 
>>>>>> -- 
>>>>>> 
>>>>>> Apache Member
>>>>>> Apache Karaf <http://karaf.apache.org/ <http://karaf.apache.org/>> 
>>>>>> Committer & PMC
>>>>>> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/ 
>>>>>> <http://wiki.ops4j.org/display/paxweb/Pax+Web/>> Committer & Project Lead
>>>>>> blog <http://notizblog.nierbeck.de/ <http://notizblog.nierbeck.de/>>
>>>>>> Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS 
>>>>>> <http://bit.ly/1ps9rkS>>
>>>>>> 
>>>>> 
>>>>> 
>>>>> 
>>>>> -- 
>>>>> 
>>>>> Apache Member
>>>>> Apache Karaf <http://karaf.apache.org/ <http://karaf.apache.org/>> 
>>>>> Committer & PMC
>>>>> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/ 
>>>>> <http://wiki.ops4j.org/display/paxweb/Pax+Web/>> Committer & Project Lead
>>>>> blog <http://notizblog.nierbeck.de/ <http://notizblog.nierbeck.de/>>
>>>>> Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS 
>>>>> <http://bit.ly/1ps9rkS>>
>>>>> 
>>>> 
>>> 
>> 
> 
> 
> 
> -- 
> 
> Apache Member
> Apache Karaf <http://karaf.apache.org/ <http://karaf.apache.org/>> Committer 
> & PMC
> OPS4J Pax Web <http://wiki.ops4j.org/display/paxweb/Pax+Web/ 
> <http://wiki.ops4j.org/display/paxweb/Pax+Web/>> Committer & Project Lead
> blog <http://notizblog.nierbeck.de/ <http://notizblog.nierbeck.de/>>
> Co-Author of Apache Karaf Cookbook <http://bit.ly/1ps9rkS 
> <http://bit.ly/1ps9rkS>>
> 

Reply via email to