如何在密钥保护身份验证之前调用 javax.servlet.Filter

我们使用 resteasy 开发了一个 REST API。(部署在《野虱10》中)

基本上,这些 REST API 是从另一个应用程序内部调用的,端点使用密钥保护。

但是,一个端点向外部方公开(该端点也使用密钥保护)。

但是由于外部方无法提供Keycloak Autherization代码,因此我们已经完成了一个实现,其中客户端使用auth_key生成的应用程序进行注册,并且客户端将使用该auth_key调用端点。

然后在 Web 过滤器(javax.servlet.Filter)中,使用 tha auth_key我们得到相关的密钥保护身份验证持有者令牌。如果需要(例如:令牌已过期),我们也调用密钥斗篷服务器。收到后,我们将该Autherization令牌添加到Web过滤器中的httpRequest中,然后继续执行端点应用程序。

但问题是,密钥保护身份验证是在 Web 筛选器之前调用的。我正在寻找的是“如何在密钥保护身份验证之前调用Web过滤器?

编辑:

现在我正试图找到一种方法,如这里所提到的。将请求标头设置为在密钥掩护中进行身份验证之前请求。在那里,我可以在身份验证发生之前获得呼叫。但是我无法在那里设置请求标头。

网.xml

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns="http://java.sun.com/xml/ns/javaee"
    xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
    version="3.0">
    <display-name>Restful Web Application</display-name>
    <context-param>
        <param-name>resteasy.scan</param-name>
        <param-value>true</param-value>
    </context-param>

    <!-- keycloak -->

    <context-param>
        <param-name>keycloak.config.resolver</param-name>
        <param-value>package.to.HeaderBasedKeycloakConfigResolver</param-value>
    </context-param>

    <security-constraint>
        <web-resource-collection>
            <web-resource-name>REST endpoints</web-resource-name>
            <url-pattern>/ep-name/resource-name</url-pattern>
        </web-resource-collection>
        <auth-constraint>
            <role-name>resource-name</role-name>
        </auth-constraint>
    </security-constraint>

    <!-- more security-constraint -->
    <!-- more security-constraint -->
    <!-- more security-constraint -->

    <login-config>
        <auth-method>KEYCLOAK</auth-method>
        <realm-name>realm-name</realm-name>
    </login-config>

    <security-role>
        <role-name>role-name-for-resource-1</role-name>
        <role-name>role-name-for-resource-2</role-name>
        <!-- more security-role -->
        <!-- more security-role -->
        <!-- more security-role -->
    </security-role>

    <listener>
        <listener-class>
            org.jboss.resteasy.plugins.server.servlet.ResteasyBootstrap</listener-class>
    </listener>

    <servlet>
        <servlet-name>resteasy-servlet</servlet-name>
        <servlet-class>
            org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher
        </servlet-class>
        <init-param>
            <param-name>resteasy.servlet.mapping.prefix</param-name>
            <param-value>/ep-name</param-value>
        </init-param>
    </servlet>

    <servlet-mapping>
        <servlet-name>resteasy-servlet</servlet-name>
        <url-pattern>/ep-name/*</url-pattern>
    </servlet-mapping>

    <filter>
      <filter-name>WebFilter</filter-name>
      <filter-class>package.to.filter.WebFilter</filter-class>
   </filter>

   <filter-mapping>
      <filter-name>WebFilter</filter-name>
      <url-pattern>/desired-ep-name/*</url-pattern>
   </filter-mapping>

</web-app>

enter image description here


答案 1

您是否尝试过更改Web中元素的顺序.xml(例如,将过滤器定义放在servlet定义之前)?

不确定它是否有效,但文档说:“链中过滤器的顺序与过滤器映射在Web应用程序部署描述符中出现的顺序相同"

这个原理也可能适用于 servlet 和过滤器之间的顺序...


答案 2

这可能是因为Tomcat身份验证阀在过滤器之前启动。检查身份验证器.属性文件。您可能需要将过滤器类包装为 Valve


推荐