多个安全领域

gue*_*est 1 security jboss jaas wildfly jakarta-ee

我尝试在我的应用程序中有多个安全领域,但在部署过程中出现异常:

消息:检测到多个登录配置元素

web.xml 片段:

....
<security-constraint>
    <display-name>Admin Constraint</display-name>
    <web-resource-collection>
        <web-resource-name>Admin Pages</web-resource-name>
        <description/>
        <url-pattern>/admin/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <description/>
        <role-name>admin</role-name>
    </auth-constraint>
</security-constraint>
<login-config>
    <auth-method>BASIC</auth-method>
    <realm-name>ApplicationRealm</realm-name>
</login-config>
<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>mb-domain</realm-name>
</login-config>
<security-role>
    <description/>
    <role-name>admin</role-name>
</security-role>
<security-role>
    <description/>
    <role-name>user</role-name>
</security-role>
...
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

Uux*_*Uux 5

<login-config>每个 Web 模块部署描述符只能使用一个。

根据Servlet 规范 v. 3.1 的§14.2 :

处理部署描述符的规则

[...]

  • web-app在此版本的规范中,下面的子元素可以按任意顺序排列。由于 XML Schema 的限制,distributablesession-configwelcome-file-listjsp-configlogin-config、 和元素的多样性locale-encoding-mapping-list从“可选”改为“0 或多个”。当部署描述符包含、 和中的多个元素时session-config,容器必须用描述性错误消息通知开发人员。jsp-configlogin-config

备择方案:

  • 使用程序化身份验证(基于 JASPIC 或您的 Java EE / Servlet 实现提供的任何工具)。
  • 使用 EAR 打包(如果每个模块的单一身份验证策略是可以接受的)。
  • 删除容器管理的身份验证。