如何解决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.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中,它说[强调]:
配置用户、组等授权信息到角色映射。 您可以通过以下方式配置授权表:
-
如果您有 EAR 文件,则可以将授权配置定义添加到 ibm-application-bnd.xml 或 ibm-application-bnd.xmi 文件中。
-
如果您有独立的 WAR 文件,您可以将授权表定义添加到相应应用程序元素下的 server.xml 文件中。您可以使用适用于 Eclipse 的 WebSphere® Application Server Developer Tools 来执行此操作。
这是否意味着对于战争应用程序,绑定必须在 server.xml 上?
解决方法
每个 this answer,META-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-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/resources
中。
现在我有两个 META-INF/
文件夹 (¯\_(ツ)_/¯).
更新
除了有两个 META-INF/
文件夹(本身就有问题),现在我的测试无法访问来自 META-INF/
的资源(另一个在 WEB-INF/classes/META-INF
中很容易获得,作为 WEB-INF/classes/
中的每个资源)。
那您可能会问,为什么我需要从测试中访问 ibm-application-bnd.xml
。因为我使用的是 arquillian,我需要创建一个部署,我需要包含这些角色 组映射。
现在我有 3 个选择:
-
在
ibm-application-bnd.xml
内创建一个src/test/resources
的副本;这里的问题是我需要保持同步; -
将
src/main/webapps
添加到 surefire/failsafe 类路径(请参阅 this answer); -
特别是对于 Liberty/OpenLiberty,我可以依赖隐式映射(假设每个组绑定到同名的角色;去查找 CWWKS2104I here)。这是我目前选择的。
选项 1 和选项 3 有相同的缺点:经过测试的代码并不完全是将部署到生产环境的代码。
选项 2 有另一个缺点:当通过 IDE 运行测试时,这个额外的文件夹也必须添加到类路径中(除非 IDE 与 maven 有很好的集成并且可以读取 surefire/failsafe 配置)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。