Hi, You could subclass JettyWebXmlConfiguration, and point it to a different jetty-web.xml, outside of your webapp that sets up only what you need.
Or you could create your own Configuration class, make sure it comes _after_ JettyWebXmlConfiguration, and re-set up the SecurityHandler the way you want it. Or you could pre-extract the war, and copy over a different jetty-web.xml file that doesn't do the security handler setup. Jan On Tue, 14 Dec 2021 at 04:10, Patrick Buchheit <pbt...@gmail.com> wrote: > Here is what the setup method for my tests looks like: > > *private* *static* HashLoginService *loginService*; > > *private* *final* *static* *int* *port* = 8089; > > @BeforeClass > > *public* *static* *void* setUpBeforeClass() *throws* Exception { > > *server* = *new* Server(*port*); > > ClassList classList = ClassList.*setServerDefault*(*server*); > > // uncommenting this line will avoid the error but require us to specify > all the configuration from jetty-web.xml by hand. > > // boolean removed = > classList.remove("org.eclipse.jetty.webapp.JettyWebXmlConfiguration"); > > classList.addAfter("org.eclipse.jetty.webapp.FragmentConfiguration", > "org.eclipse.jetty.plus.webapp.EnvConfiguration", > "org.eclipse.jetty.plus.webapp.PlusConfiguration"); > > WebAppContext context = *new* WebAppContext("eyerep-data", "/eyerep-data" > ); > > context.setDescriptor("src/main/webapp/WEB-INF/web.xml"); > > context.setResourceBase("src/main/webapp"); > > //we want a custom configuration for the tests so we need to supply an > override descriptor > > context.setOverrideDescriptors(Arrays.*asList*( > "src/test/resources/override-web.xml")); > > // Creating the LoginService for the realm > > *loginService* = *new* HashLoginService("EyeRep"); > > // Setting the realm configuration there the users, passwords and roles > reside > > *loginService*.setConfig("src/test/resources/realm.properties"); > > context.getSecurityHandler().setLoginService(*loginService*); > > context.getSecurityHandler().setAuthenticator(*new* BasicAuthenticator()); > > BasicDataSource ds = *null*; > > ds = *new* BasicDataSource(); > > ds.setUrl( > "jdbc:h2:mem:myDB;create=true;MODE=MSSQLServer;DATABASE_TO_UPPER=FALSE;"); > > org.eclipse.jetty.plus.jndi.Resource mydatasource = *new* > org.eclipse.jetty.plus.jndi.Resource(*null*, "jdbc/NavDS",ds); > > > *server*.setHandler(context); > > *server*.start(); > > > } > > > > If I run the test with that code, it will end up overriding my custom > security handler with the values from jetty-web.xml when server.start() is > called. I can work around it by removing > org.eclipse.jetty.webapp.JettyWebXmlConfiguration > from the class list, but then I have to specify everything that would > normally be handled by jetty-web.xml by hand. I'm trying to keep my test > configuration as close to the production config as possible and only > override the things that need to be different for the test environment. > > > > On Fri, Dec 10, 2021 at 7:02 PM Jan Bartel <j...@webtide.com> wrote: > >> Patrick, >> >> You'd need to provide the non-working code. In the absence of that, I've >> whipped up a working example that might help you: >> >> >> public class OneWebApp >> { >> public static Server createServer(int port) throws IOException >> { >> // Create a basic jetty server object that will listen on port >> 8080. >> // Note that if you set this to port 0 then a randomly available >> port >> // will be assigned that you can either look in the logs for the >> port, >> // or programmatically obtain it for use in test cases. >> Server server = new Server(port); >> >> // The WebAppContext is the entity that controls the environment >> in >> // which a web application lives and breathes. In this example the >> // context path is being set to "/" so it is suitable for serving >> root >> // context requests and then we see it setting the location of >> the war. >> // A whole host of other configurations are available, ranging >> from >> // configuring to support annotation scanning in the webapp >> (through >> // PlusConfiguration) to choosing where the webapp will unpack >> itself. >> WebAppContext webapp = new WebAppContext(); >> webapp.setContextPath("/"); >> Path warFile = >> JettyDemos.find("demo-async-rest/demo-async-rest-webapp/target/demo-async-rest-webapp-@VER >> @.war"); >> webapp.setWar(warFile.toString()); >> >> String realmResourceName = "etc/realm.properties"; >> ClassLoader classLoader = >> SecuredHelloHandler.class.getClassLoader(); >> URL realmProps = classLoader.getResource(realmResourceName); >> if (realmProps == null) >> throw new FileNotFoundException("Unable to find " + >> realmResourceName); >> >> LoginService loginService = new HashLoginService("XX", >> realmProps.toExternalForm()); >> >> webapp.getSecurityHandler().setLoginService(loginService); >> >> // A WebAppContext is a ContextHandler as well so it needs to be >> set to >> // the server so it is aware of where to send the appropriate >> requests. >> server.setHandler(webapp); >> return server; >> } >> >> public static void main(String[] args) throws Exception >> { >> int port = ExampleUtil.getPort(args, "jetty.http.port", 8080); >> Server server = createServer(port); >> >> Configurations.setServerDefault(server); >> >> // Start things up! >> server.start(); >> >> server.dumpStdErr(); >> >> // The use of server.join() the will make the current thread join >> and >> // wait until the server is done executing. >> server.join(); >> } >> >> >> On Sat, 11 Dec 2021 at 04:34, Patrick Buchheit <pbt...@gmail.com> wrote: >> >>> I posted this question on StackOverflow ( >>> https://stackoverflow.com/questions/70278074/override-login-service-for-embedded-jetty >>> ) but I'm hoping someone here can help as well. I'm trying to do some >>> integration testing on a jetty application with basic authentication. I'm >>> using a jetty-web.xml file to configure the security handler like this: >>> >>> <Configure id=*"eyerep-data"* class= >>> *"org.eclipse.jetty.webapp.WebAppContext"*> >>> >>> <Set name=*"contextPath"*>/eyerep-data</Set> >>> >>> <Set name=*"war"*><SystemProperty name=*"jetty.base"* default= >>> *"./webapps"* />/eyerep-data/eyerep-data.war</Set> >>> >>> <Get name=*"securityHandler"*> >>> >>> <Set name=*"loginService"*> >>> >>> <New class=*"org.eclipse.jetty.security.HashLoginService"*> >>> >>> <Set name=*"name"*>EyeRep</Set> >>> >>> <Set name=*"config"*><SystemProperty name=*"jetty.home"* >>> default=*"."*/>/etc/realm.properties</Set> >>> >>> </New> >>> >>> </Set> >>> >>> </Get> >>> >>> </Configure> >>> >>> >>> >>> That works for production, but for testing, I'm using an embedded jetty >>> server so I need to use a different config path for the login service. >>> >>> >>> The problem I'm running into is that there doesn't seem to be any way to >>> override just the config path. if I try to do something like: >>> >>> >>> WebAppContext context = *new* WebAppContext(); >>> >>> *loginService* = ((HashLoginService)context >>> .getSecurityHandler().getLoginService()); >>> >>> *loginService*.setConfig("src/test/resources/realm.properties"); >>> >>> >>> I found that there is no point where that code can succeed. If I run it >>> before calling 'server.start()' the login service has not been initialized >>> yet and I get an NPE. If I run it after the call to 'server.start()', it is >>> too late. The server will already have tried and failed to setup the user >>> store using the invalid config path. >>> >>> >>> I'm at a bit of a loss here. I don't see anything equivalent to >>> context.setOverrideDescriptors() >>> for jetty-web.xml. Is there any way to do this without completely replacing >>> the work done by jetty-web.xml with manual code? >>> >>> >>> _______________________________________________ >>> jetty-users mailing list >>> jetty-users@eclipse.org >>> To unsubscribe from this list, visit >>> https://www.eclipse.org/mailman/listinfo/jetty-users >>> >> >> >> -- >> Jan Bartel <j...@webtide.com> >> www.webtide.com >> *Expert assistance from the creators of Jetty and CometD* >> >> _______________________________________________ >> jetty-users mailing list >> jetty-users@eclipse.org >> To unsubscribe from this list, visit >> https://www.eclipse.org/mailman/listinfo/jetty-users >> > _______________________________________________ > jetty-users mailing list > jetty-users@eclipse.org > To unsubscribe from this list, visit > https://www.eclipse.org/mailman/listinfo/jetty-users > -- Jan Bartel <j...@webtide.com> www.webtide.com *Expert assistance from the creators of Jetty and CometD*
_______________________________________________ jetty-users mailing list jetty-users@eclipse.org To unsubscribe from this list, visit https://www.eclipse.org/mailman/listinfo/jetty-users