使 Jetty 容器 AUTH return 不同 headers

Make Jetty Container AUTH return different headers

目前我有一个工作系统,我需要做一些小的改动。我想更改当用户未登录时返回的 headers 生成 rest-call。目前它总是返回 WWW-Authenticate: Basic header 即 auto-pops 浏览器登录。

我想把它改成其他不会触发它的东西(所以没有 basic/digest)。然而,这似乎无法通过 jetty-maven-plugin 实现,因为 web.xml 过滤器确实有效,但它们会在有人进入程序后触发。我希望过滤器在码头本身也能正常工作。

目前我找到了 RewriteHeaders 并且可以正常工作,但是它们只是添加,而不是重写 header。

<Set name="handler">
    <New id="Handlers" class="org.eclipse.jetty.server.handler.HandlerCollection">
        <Set name="handlers">
            <Array type="org.eclipse.jetty.server.Handler">
                <Item>
                    <New id="Contexts" class="org.eclipse.jetty.server.handler.ContextHandlerCollection"/>
                </Item>
                <Item>
                    <New id="DefaultHandler" class="org.eclipse.jetty.server.handler.DefaultHandler"/>
                </Item>
            </Array>
        </Set>
    </New>
</Set>

<Get id="oldhandler" name="handler"/>

<Set name="handler">
    <New id="Rewrite" class="org.eclipse.jetty.rewrite.handler.RewriteHandler">
        <Set name="handler">
            <Ref id="oldhandler"/>
        </Set>

        <!-- Add Acces-Control-Allow-Origin -->
        <Call name="addRule">
            <Arg>
                <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                    <Set name="pattern">*</Set>
                    <Set name="name">Access-Control-Allow-Origin</Set>
                    <Set name="value">http://localhost:1337</Set>
                </New>
            </Arg>
        </Call>

        <!-- Change the WWW-Authenticate into something non digest/basic -->
        <Call name="addRule">
            <Arg>
                <New class="org.eclipse.jetty.rewrite.handler.HeaderPatternRule">
                    <Set name="pattern">*</Set>
                    <Set name="name">WWW-Authenticate</Set>
                    <Set name="value">NotBasic</Set>
                </New>
            </Arg>
        </Call>
    </New>
</Set>

长话短说...如何覆盖 HeaderPatternRule 而不是仅在 header 中添加内容?

身份验证发生在之前 您的所有 webapp 的 servlet 和过滤器。

您要么不需要使用 Servlet 安全和身份验证(在您自己的 webapp 中执行所有操作),要么编写自定义身份验证实现来支持您的用例。

您需要编写一个自定义的身份验证器来替换 BasicAuthenticator。您可以将您的代码基于 BasicAuthenticator,然后更改您希望它运行的 headers。

或者不使用任何容器身份验证并编写实现您的身份验证机制并根据请求使用登录方法的过滤器。