微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

OpenLiberty 忽略 WEB-INF/ibm-application-bnd.xml

如何解决OpenLiberty 忽略 WEB-INF/ibm-application-bnd.xml

我的应用程序 (my-app.war) 有一个 JAX-RS 端点,使用给定的角色进行保护,如下所示:

端点.java

@Path("endpoint/")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
@DeclareRoles({"ADMIN_ROLE"})
public class Endpoint {
  @POST
  @RolesAllowed({"ADMIN_ROLE"})
  public void post() {
  }
}

server.xml

<server>
  <featureManager>
    <feature>jaxrs-2.1</feature>
    <feature>appSecurity-3.0</feature>
  </featureManager>

  <application id="my-app" context-root="/" location="my-app.war" type="war">
  </application>

  <variable name="default.http.port" defaultValue="9080"/>
  <variable name="default.https.port" defaultValue="9443"/>

  <httpEndpoint id="defaultHttpEndpoint" httpPort="${default.http.port}" httpsPort="${default.https.port}"/>

  <basicRegistry realm="defaultRealm">
    <user name="test-user" password="test-password"/>
    <group name="ADMIN_GROUP">
      <member name="test-user"/>
    </group>
  </basicRegistry>

</server>

现在我必须将 ADMIN_GROUP 绑定到 ADMIN_ROLE

如果我在 server.xml application 上执行此操作,则一切正常:

  <application id="my-app" context-root="/" location="my-app.war" type="war">
    <application-bnd>
      <security-role name="ADMIN_ROLE">
        <group name="ADMIN_GROUP" />
      </security-role>
    </application-bnd>
  </application>

应用程序已部署,在未经身份验证的情况下调用端点时,它返回 403(需要身份验证)。当提供身份验证标头时,它会按预期返回 204(无内容)。

现在问题出在我尝试在 ibm-application-bnd.xml 中配置绑定时:

<?xml version="1.0" encoding="UTF-8"?>

<application-bnd xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://websphere.ibm.com/xml/ns/javaee http://websphere.ibm.com/xml/ns/javaee/ibm-application-bnd_1_2.xsd"
  xmlns="http://websphere.ibm.com/xml/ns/javaee"
  version="1.2">
<
  <security-role name="ADMIN_ROLE">
    <group name="ADMIN_GROUP" />
  </security-role>
</application-bnd>

我已经把它放在 meta-inf/ibm-application-bnd.xmlWEB-INF/ibm-application-bnd.xml 中。但是它们都被完全忽略了(我什至在那里添加了无效的 xml,但没有从 OpenLiberty 收到错误消息)。

对端点的每次调用都会返回 403,即使提供了身份验证也是如此。

https://www.ibm.com/docs/en/was-liberty/base?topic=liberty-configuring-authorization-applications-in中,它说[强调]:

配置用户、组等授权信息到角色映射。 您可以通过以下方式配置授权表:

  • 如果您有 EAR 文件,则可以将授权配置定义添加到 ibm-application-bnd.xml 或 ibm-application-bnd.xmi 文件中。

  • 如果您有独立的 WAR 文件您可以将授权表定义添加到相应应用程序元素下的 server.xml 文件中。您可以使用适用于 Eclipse 的 WebSphere® Application Server Developer Tools 来执行此操作。

这是否意味着对于战争应用程序,绑定必须在 server.xml 上?

解决方法

每个 this answerMETA-INF/ibm-application-bnd.xml - 虽然没有记录 - 可以在网络档案中使用。

然后我已经 mvn package 我的项目,并检查了它的 war 文件(仅显示相关文件):

  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2021-04-28 22:13   META-INF/
      131  2021-04-28 22:13   META-INF/MANIFEST.MF
        0  2021-04-28 22:13   WEB-INF/
        0  2021-04-28 22:13   WEB-INF/classes/
        0  2021-04-28 22:13   WEB-INF/classes/META-INF/
        0  2021-04-28 22:13   WEB-INF/lib/
        0  2021-04-22 17:58   WEB-INF/beans.xml
      134  2021-04-28 22:13   WEB-INF/classes/META-INF/ibm-application-bnd.xml
      592  2021-04-28 22:13   WEB-INF/classes/META-INF/persistence.xml
   300365  2021-04-15 09:58   WEB-INF/lib/log4j-api-2.14.1.jar
  1745700  2021-04-15 09:59   WEB-INF/lib/log4j-core-2.14.1.jar
      393  2021-04-28 21:50   WEB-INF/web.xml
        0  2021-04-28 22:13   META-INF/maven/
---------                     -------

现在请注意,有 META-INF/* 个条目和 WEB-INF/classes/META-INF/* 个条目。

然后我找到了 this answer(与自由/开放自由无关)。第一句话就让我惊叹:

看起来您的 META-INF 文件夹在 src/main/resources 目录中。

和我的一模一样。所以我将 META-INFsrc/main/resources 移到 src/main/webapp

现在战争列表如下:

  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2021-04-28 22:22   META-INF/
      131  2021-04-28 22:22   META-INF/MANIFEST.MF
        0  2021-04-28 22:22   WEB-INF/
        0  2021-04-28 22:22   WEB-INF/classes/
        0  2021-04-28 22:22   WEB-INF/lib/
      134  2021-04-28 22:13   META-INF/ibm-application-bnd.xml
      592  2021-04-27 10:19   META-INF/persistence.xml
        0  2021-04-22 17:58   WEB-INF/beans.xml
   300365  2021-04-15 09:58   WEB-INF/lib/log4j-api-2.14.1.jar
  1745700  2021-04-15 09:59   WEB-INF/lib/log4j-core-2.14.1.jar
      393  2021-04-28 21:50   WEB-INF/web.xml
        0  2021-04-28 22:22   META-INF/maven/
---------                     -------

现在文件 ibm-application-bnd.xml 得到处理。 它有效。除了……

这样 JPA 就不再起作用了。

看来 META-INF/persistence.xml 毕竟必须在 src/main/resources 中。

现在我有两个 META-INF/ 文件夹 (¯\_(ツ)_/¯).


更新

除了有两个 META-INF/ 文件夹(本身就有问题),现在我的测试无法访问来自 META-INF/ 的资源(另一个在 WEB-INF/classes/META-INF 中很容易获得,作为 WEB-INF/classes/ 中的每个资源)。

那您可能会问,为什么我需要从测试中访问 ibm-application-bnd.xml。因为我使用的是 arquillian,我需要创建一个部署,我需要包含这些角色 组映射。

现在我有 3 个选择:

  1. ibm-application-bnd.xml内创建一个src/test/resources的副本;这里的问题是我需要保持同步;

  2. src/main/webapps 添加到 surefire/failsafe 类路径(请参阅 this answer);

  3. 特别是对于 Liberty/OpenLiberty,我可以依赖隐式映射(假设每个组绑定到同名的角色;去查找 CWWKS2104I here)。这是我目前选择的。

选项 1 和选项 3 有相同的缺点:经过测试的代码并不完全是将部署到生产环境的代码。

选项 2 有另一个缺点:当通过 IDE 运行测试时,这个额外的文件夹也必须添加到类路径中(除非 IDE 与 maven 有很好的集成并且可以读取 surefire/failsafe 配置)。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。