当前位置: 首页 > 知识库问答 >
问题:

OpenLiberty ignoring WEB-INF/ibm-application-bnd.xml

叶茂才
2023-03-14

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

Endpoint.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 < code > 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>

部署应用程序,并且在不进行身份验证的情况下调用endpoint时,它将返回403(需要身份验证)。当提供身份验证标头时,它将按预期返回 204(无内容)。

现在,当我尝试在ibmapplicationbnd.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>

我已经将其放在<code>META-INF/ibm应用程序bnd中。xml和WEB-INF/ibm应用程序bnd.xml。但它们都被完全忽略了(我甚至在那里添加了无效的xml,但没有收到OpenLiberty的错误消息)。

对endpoint的每次调用都返回403,即使提供了身份验证。

在 https://www.ibm.com/docs/en/was-liberty/base?topic=liberty-configuring-authorization-applications-in 中,它说[着重号是后加的]:

配置授权信息,例如用户和组到角色的映射。您可以通过以下方式配置授权表:

> < li>

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

如果有独立的WAR文件,可以将授权表定义添加到server.xml文件中相应的应用程序元素下。您可以使用WebSphere Application Server Developer Tools for Eclipse来完成这项工作。

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

共有1个答案

马博学
2023-03-14

根据这个答案,<code>META-INF/ibm application bnd。xml-尽管没有文档记录-可以在web存档中使用。

然后,我< code>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/class/META-INF/*条目。

然后我找到了这个答案(它与自由/开放自由无关)。它的第一句话让我敬畏:

看起来您的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就不再工作了。

似乎元 INF/持久性.xml必须毕竟在 src/main/资源中。

现在我有两个< code>META-INF/文件夹(\_(ツ)_/)。

更新

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

那么我为什么需要访问ibm应用程序bnd。您可能会问,来自测试的xml</code>。因为我正在使用arquillian,我需要创建一个部署,我需要包括这些角色

现在我有三个选择:

>

  • 创建ibmapplicationbnd的副本。src/test/resources中的xml;这里的问题是我需要保持两者同步;

    将< code>src/main/webapps添加到surefire/failsafe类路径中(见本答案);

    具体到Liberty/OpenLiberty,我可以依赖一个隐式映射(假设每个组绑定到一个同名的角色;去这里找CWWKS2104I)。这是我目前选择的一个。

    选项1和3有着相同的缺点:被测试的代码并不完全是将被部署到产品中的代码

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

    这个

  •  类似资料:
    • 我不得不两个都用(说来也奇怪..)Weblogic 12C服务器(12.2.1)上Weblogic.xml的和属性 它是基于Jersey 1.9的REST应用程序。(Jersey 1.x JAX-RS RI)和Guice。 1.为什么使用:prefere-web-inf-classs 如果您有多个WAR,您必须将guice-jersey/guice的库放置在WAR/lib级别,否则会出现多绑定错误

    • 我目前正在使用一台开发机器进行我的同事构建的java开发工作。此计算机上的IBM RAD安装程序具有运行服务器配置文件“Websphere Application server v6.0”的IBM Websphere-Portal安装程序,因此我可以通过浏览器使用“http://localhost:9081/wps/portal/home". 今天,我试图在RAD上设置自己的动态web项目。当运行

    • 我正在尝试在IBM WAS(Liberty Profile)服务器之前设置IIS(版本8.x,windows 2008),以便它可以将所有特定请求路由到IBM WebSphere应用程序服务器(Liberty-Profile,Liberty)。 我已经安装了 已安装IBM WebSphere Application Server Liberty Core(8.5.5版) 已安装IBM Mobile

    • (截至2018年5月8日更新) 这是关于使用“WebSphere Deployer插件”将EAR部署到Jenkins中的WebSphere Application Server时在连接阶段遇到的一个问题。 “测试连接”成功。不幸的是,在实际的作业运行中,部署阶段在连接时仍然失败。 相关日志信息如下 [Jenkins控制台日志/作业日志(显示在Jenkins管理UI“控制台输出”中)] [WAS控制

    • 问题内容: 我必须在 Weblogic 12c服务器(12.2.1) 上同时使用(非常足够..)和 weblogic.xml的 属性。 它是基于Jersey 1.9的REST应用程序。(Jersey 1.x JAX-RS RI)和Guice。 1.为什么使用:prefer-web-inf-classes 如果您有多个WAR,则必须在war / lib级别放置guice-jersey / guice

    • 我正在IBM Websphere application Server7上使用JAX-WS使用web服务。在传递SOAP消息时设置WS消息级别安全性。UsernameToken xmlns:wsu未正确传递到提供程序端。是否需要在WebSphere Server上进行任何配置? SOAP消息打印在我的应用程序日志中, wsse:usernameToken wsu:id=“xxxx”xmlns:ws