我们使用resteasy开发了一个REST API(部署在wildfly 10中)。
基本上这些REST API是从另一个应用程序内部调用的,并且端点受到Keycloak的保护。
但是一个端点向外部公开(该端点也受到Keycloak的保护)。
但由于外部方无法提供Keycloak授权代码,因此我们进行了一个实现,其中客户端使用应用程序生成的auth_key注册,并使用该auth_key调用端点。
然后,在Web过滤器(javax.servlet.Filter)中,我们使用该auth_key获取相关的Keycloak身份验证Bearer令牌。如果需要(例如:令牌已过期),我们还会调用Keycloak服务器。一旦接收到令牌,我们将该身份验证令牌添加到Web过滤器中的httpRequest中,并继续进行端点应用程序。
但问题是,“KeyCloak身份验证是在Web过滤器之前调用的”。 我正在寻找“如何在keycloak身份验证之前调用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>