java - Wildfly 8 安全域适用于简单的应用程序,但不适用于更复杂的应用程序

标签 java wildfly-8 java-ee-7

我正在更改现有的 Java EE 7 Web 应用程序,以使用标准 Java EE 安全域机制针对 Active Directory 进行身份验证。我首先创建一个简单的概念验证 Web 应用程序来测试并让 Wildfly 配置正常工作,然后将更改应用到主应用程序。我现在的情况是测试应用程序可以运行,但主应用程序不能运行。

如何让主应用程序与安全域正常工作?我该如何诊断这个问题?什么会干扰安全过程?

这是我在standalone.xml 中的领域和域配置:

<security-realms>
    <!-- Default realms omitted -->
    <security-realm name="ActiveDirectoryRealm">
        <authentication>
            <ldap connection="MyAD" base-dn="OU=Test Users,OU=AU,DC=company,DC=int">
                <username-filter attribute="sAMAccountName"/>
            </ldap>
        </authentication>
    </security-realm>
</security-realms>
<outbound-connections>
    <ldap name="MyAD" url="ldap://company.int" search-dn="CN=Wildfly AS,OU=Service Accounts,OU=AU,DC=company,DC=int" search-credential="xxx"/>
</outbound-connections>

<!-- Skip many lines -->

<security-domain name="active-directory" cache-type="default">
    <authentication>
        <login-module code="Remoting" flag="optional">
            <module-option name="password-stacking" value="useFirstPass"/>
        </login-module>
        <login-module code="RealmDirect" flag="sufficient">
            <module-option name="password-stacking" value="useFirstPass"/>
            <module-option name="realm" value="ActiveDirectoryRealm"/>
        </login-module>
    </authentication>
</security-domain>

这是我的 jboss-web.xml 文件(两个应用程序中相同):

<jboss-web>
    <security-domain>active-directory</security-domain>
</jboss-web>

最后是 web.xml 的安全位(除了 URL 模式受到限制外,两个应用程序中的安全位相同):

<security-constraint>
    <web-resource-collection>
        <web-resource-name>Unauthenticated Resources</web-resource-name>
        <url-pattern>/css/*</url-pattern>
        <url-pattern>/font/*</url-pattern>
        <url-pattern>/images/*</url-pattern>
        <url-pattern>/js/*</url-pattern>
        <url-pattern>/lib/*</url-pattern>
        <url-pattern>/partials/*</url-pattern>
    </web-resource-collection>
</security-constraint>

<security-constraint>
    <web-resource-collection>
        <web-resource-name>All Resources</web-resource-name>
        <url-pattern>/*</url-pattern>
    </web-resource-collection>
    <auth-constraint>
        <role-name>*</role-name>
    </auth-constraint>
</security-constraint>

<login-config>
    <auth-method>FORM</auth-method>
    <realm-name>My Realm</realm-name>
    <form-login-config>
        <form-login-page>/Login.html</form-login-page>
        <form-error-page>/NoAccess.html</form-error-page>
    </form-login-config>
</login-config>

<security-role>
    <role-name>*</role-name>
</security-role>

有关应用程序的一些事实:

  • 这两个应用程序都使用 Servlet 3.1 web.xml 文件并打包为 WAR。
  • 两个应用程序都会激活 Undertow 和 EJB 子系统,而主应用程序还会激活 JPA。
  • 我已将这两个应用程序部署到在本地计算机上运行的同一个 Wildfly 8.2 实例。
  • 主应用程序使用 Spring(因为我们使用 Spring-Data 和 Spring-MVC)以及 EJB,而测试应用程序不使用 Spring。

测试应用程序运行良好,但主应用程序总是无法登录(我被重定向到表单错误页面)。我为 org.jboss.security 打开了 TRACE 日志记录,但当我尝试登录时得到的只是:

2015-07-22 13:36:54,903 TRACE [org.jboss.security] (default task-1) PBOX000354: Setting security roles ThreadLocal: null

对于额外的奇怪点,我可以将 jboss-web.xml 中的安全域值设置为 active-directoryjava:/jaas/active-directory 并且两者都有效,但是在主应用程序中使用前缀会导致它无法启动。我知道the prefix is no longer supported in Wildfly 8但不确定为什么两个应用程序之间的行为不同。

预先感谢您的任何帮助和建议,非常感谢!

最佳答案

嗯,这很尴尬......事实证明问题出在我的登录表单中。我认为这两个应用程序之间是相同的,但主应用程序的输入字段名称中有一个前导空格。

关于java - Wildfly 8 安全域适用于简单的应用程序,但不适用于更复杂的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31554011/

相关文章:

java - 数据集合的最佳数据结构,每次迭代之间仅发生变化

java - 什么是NullPointerException,我该如何解决?

mongodb - Wildfly 8 中用于 CDI 的自定义 jndi 对象工厂

jsf-2 - 如何更改 JSF 2.2 中的 Content-Type header

java - RestEasy 客户端所需的 jar

java - 在 Tomcat 中设置属性时出现 NullPointerException

java - 针对大型 Web 项目从 ASP.NET 切换到 Java EE

java - 覆盖哈希码方法时的HashMap性能

java - 为什么 JTree 仅在创建 JTree 之前填充关联的 DefaultTreeModel 时才显示数据?

java - Wildfly 8,异步方法上 UriInfo 上下文的问题