WildFly 33 Beta添加@Stateless服务后遗留安全域兼容性报错求助
问题:WildFly 33 Beta 包含@Stateless服务时Elytron BASIC认证报错
使用WildFly 33 Beta结合Elytron实现BASIC认证的项目,当加入@Stateless服务后启动服务器,抛出以下错误:
Caused by: java.lang.IllegalStateException: WFLYEJB0530: The deployment is configured to use a legacy security domain 'servlet-security-quickstart' which is no longer supported.
当前配置文件
jboss-web.xml
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE jboss-web> <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"> <!-- Configure usage of the security domain "other" --> <security-domain>servlet-security-quickstart</security-domain> <disable-audit>true</disable-audit> </jboss-web>
web.xml
<?xml version="1.0"?> <web-app version="6.0" xmlns="https://jakarta.ee/xml/ns/jakartaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="https://jakarta.ee/xml/ns/jakartaee https://jakarta.ee/xml/ns/jakartaee/web-app_6_0.xsd"> <security-constraint> <web-resource-collection> <web-resource-name>MyDomain admin users</web-resource-name> <url-pattern>/admin/*</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ROLE_ADMIN</role-name> </auth-constraint> </security-constraint> <security-role> <role-name>ROLE_USER</role-name> </security-role> <security-role> <role-name>ROLE_ADMIN</role-name> </security-role> <!-- Configure login to be HTTP Basic --> <login-config> <auth-method>BASIC</auth-method> </login-config> <servlet> <servlet-name>Faces Servlet</servlet-name> <servlet-class>jakarta.faces.webapp.FacesServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>Faces Servlet</servlet-name> <url-pattern>*.xhtml</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.xhtml</welcome-file> </welcome-file-list> </web-app>
现象说明
- 移除@Stateless服务后,BASIC认证可正常显示登录窗口并完成登录;
- 移除jboss-web.xml中的
security-domain配置,则无法完成登录。
解决方案
1. 替换jboss-web.xml的安全域配置为Elytron格式
WildFly 33中EJB组件不再支持legacy安全域,需要改用Elytron专属的<elytron-security-domain>标签替换原有的<security-domain>:
<?xml version="1.0" encoding="UTF-8"?> <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"> <!-- 使用Elytron安全域替代legacy安全域 --> <elytron-security-domain>servlet-security-quickstart</elytron-security-domain> <disable-audit>true</disable-audit> </jboss-web>
注意:此处的servlet-security-quickstart必须是WildFly Elytron子系统中已配置的安全域名称,而非legacy安全域。
2. 确认Elytron安全域配置有效性
检查WildFly的服务器配置文件(如standalone.xml),确保已正确配置对应名称的Elytron安全域,包含必要的认证、授权组件,示例配置片段:
<subsystem xmlns="urn:wildfly:elytron:15.0" final-providers="combined-providers" disallowed-providers="OracleUcrypto"> <security-domains> <security-domain name="servlet-security-quickstart" default-realm="UsersRealm" permission-mapper="default-permission-mapper"> <realm name="UsersRealm" role-decoder="from-roles-attribute"/> </security-domain> <!-- 其他Elytron配置项 --> </security-domains> </subsystem>
3. 确保Web与EJB层安全上下文统一
当部署中包含EJB组件时,WildFly会同步处理Web和EJB的安全上下文,必须保证两者都使用Elytron安全体系,避免混合使用legacy和Elytron配置。
修改完成后重启服务器,保留@Stateless服务即可正常启动并完成BASIC认证。
内容的提问来源于stack exchange,提问作者Papp Zoltán
相关产品推荐
相关产品推荐

