代码之家  ›  专栏  ›  技术社区  ›  rslemos

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

  •  0
  • rslemos  · 技术社区  · 4 年前

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

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

    <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

    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.xml WEB-INF/ibm-application-bnd.xml . 但是它们都被完全忽略了(我甚至在那里添加了无效的xml,但是没有从OpenLiberty得到错误消息)。

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

    https://www.ibm.com/docs/en/was-liberty/base?topic=liberty-configuring-authorization-applications-in ,上面写着[emphasis added]:

    可以通过以下方式配置授权表:

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

    • 如果你有独立的战争文件, 文件位于相应的应用程序元素下。您可以使用websphereapplicationserver开发人员工具for Eclipse来实现这一点。

    这是不是意味着

    0 回复  |  直到 4 年前
        1
  •  0
  •   rslemos    4 年前

    this answer , META-INF/ibm-application-bnd.xml -虽然没有文档-但可以在web存档中使用。

    那么我已经 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-INF src/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/资源 毕竟。

    现在我有两个 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配置)。

    这个

    推荐文章