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

Reply via email to