WildFly 14中配置EAR内WAR包中WebService安全时遭遇部署错误的问题
看起来你在WildFly 14里给EAR嵌套的WAR配置WebService安全时碰到了一个典型的子系统协同问题,我来帮你拆解下问题根源和解决办法:
先复盘你的配置现状
你已经完成了Elytron和Undertow的核心安全配置:
- Elytron HTTP认证工厂
testHAF:关联了安全域TestSD和BASIC认证机制,指定了 realmTestDomain[standalone@localhost:9990 /] /subsystem=elytron/http-authentication-factory=testHAF:query() { "outcome" => "success", "result" => { "available-mechanisms" => ["BASIC"], "http-server-mechanism-factory" => "global", "mechanism-configurations" => [{ "mechanism-name" => "BASIC", "mechanism-realm-configurations" => [{"realm-name" => "TestDomain"}] }], "security-domain" => "TestSD" } } - Undertow应用安全域
TestASD:绑定了testHAF,用于接管Web请求的安全验证[standalone@localhost:9990 /] /subsystem=undertow/application-security-domain=TestASD:query() { "outcome" => "success", "result" => { "enable-jacc" => false, "http-authentication-factory" => "testHAF", "override-deployment-config" => false, "referencing-deployments" => undefined, "security-domain" => undefined, "setting" => undefined } } - WAR配置:通过
jboss-web.xml指定了Undertow应用安全域TestASD<jboss-web xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.org/schema/jbossas http://www.jboss.org/schema/jbossas/jboss-web_7_2.xsd"> <security-domain>TestASD</security-domain> </jboss-web>
问题根源:WebService子系统(JBossWS)不自动复用Undertow安全配置
当WAR中包含JAX-WS WebService时,WildFly的JBossWS子系统会接管该WebService的请求处理,而它默认不会读取jboss-web.xml里的Undertow应用安全域配置。
报错里的jboss.security.security-domain.TestASD是传统PicketBox安全域的JNDI命名格式,但你配置的是Elytron体系下的Undertow应用安全域,两者不属于同一套安全框架——JBossWS在未收到明确配置时,会尝试查找旧体系的安全域,自然找不到就报错了。
而你去掉WebService后正常,是因为此时只有Undertow子系统处理WAR的Web请求,它能正确识别jboss-web.xml里的TestASD。
解决办法:给JBossWS子系统单独配置Elytron安全域
你需要在WAR的WEB-INF目录下新增一个jboss-webservices.xml,明确告诉JBossWS使用你配置的Elytron应用安全域:
<jboss-webservices xmlns="http://www.jboss.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.jboss.com/xml/ns/javaee http://www.jboss.org/schema/jbossas/jboss-webservices_14_0.xsd" version="14.0"> <security> <!-- 指定你在Undertow中配置的应用安全域名称 --> <elytron-security-domain>TestASD</elytron-security-domain> </security> </jboss-webservices>
额外验证步骤
- 确保
jboss-webservices.xml放在WAR的WEB-INF目录下,和jboss-web.xml同级 - 重新部署EAR,观察部署日志是否还出现安全域找不到的错误
- 如果还有问题,可以用CLI确认JBossWS子系统的Elytron支持状态:
确认输出中包含[standalone@localhost:9990 /] /subsystem=webservices:query()elytron-integration-enabled且值为true(WildFly 14默认开启)
补充说明
如果你的WebService需要具体的安全约束(比如只允许特定角色访问),还需要在web.xml中配置对应的<security-constraint>、<login-config>(指定BASIC认证),或者在WebService接口/实现类上使用@RolesAllowed等安全注解——容器级的安全域是基础,安全约束是具体的访问控制规则。
内容来源于stack exchange

