在JBoss中使用多个登录模块

时间:2016-02-18 12:12:42

标签: java login ejb jboss7.x jaas

我是认证和安全领域的新手,我正在尝试扩展我的应用程序的身份验证机制,该机制目前提供传统的用户名/密码身份验证,以便用户通过LDAP服务器进行身份验证。

在当前实现中,应用程序使用来自Server API的 j_security_check 线程来验证用户身份。 Jboss的 standalone.xml 文件有一个登录模块,指向 myLoginModuleClass 类,该类扩展了 jboss.security.auth.spi.UsernamePasswordLoginModule

<security-domain name="db-domain">
  <authentication>
    <login-module code="myLoginModuleClass" flag="required" module="packageForClass">
      <module-option name="hashAlgorithm" value="SHA-256" />
      <module-option name="hashEncoding" value="base64" />
      <module-option name="password-stacking" value="useFirstPass" />
    </login-module>
  </authentication>
</security-domain>

我在一个单独的安全性中添加了另一个名为LDAP Login模块的登录模块。

<security-domain name="ldap-domain">
  <authentication>
    <login-module code="LDAPLoginModule" flag="required" module="LDAPModulePackage">
      <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" />
      <module-option name="java.naming.security.authentication" value="simple" />
      <module-option name="bindCredential" value="secret" />
      <module-option name="password-stacking" value="useFirstPass" />
    </login-module>
  </authentication>
</security-domain>

我目前面临的问题如下: jboss-web.xml 和项目的 web.xml 都指向现有的安全域:db-domain。我只能在那里指定一个安全域。 问题:如何以编程方式告诉jboss根据用户选择指向特定的登录类,这意味着如果用户选择使用ldap auth,则调用LDAPLoginModule类?或者还有其他更好的方法来进行混合模式身份验证吗?

提前感谢

3 个答案:

答案 0 :(得分:6)

与此同时,我找到了一个解决方法。 我可以在单个安全域中指定登录模块,并从&#34; required&#34;更改标志。足够&#34;。

&#13;
&#13;
<security-domain name="common-domain">
  <authentication>
    <login-module code="LDAPLoginModule" flag="sufficient" module="LDAPModulePackage">
      <module-option name="java.naming.factory.initial" value="com.sun.jndi.ldap.LdapCtxFactory" />
      <module-option name="java.naming.security.authentication" value="simple" />
      <module-option name="bindCredential" value="secret" />
      <module-option name="password-stacking" value="useFirstPass" />
    </login-module>

    <login-module code="mydbLoginModuleClass" flag="sufficient" module="packageForClass">
      <module-option name="hashAlgorithm" value="SHA-256" />
      <module-option name="hashEncoding" value="base64" />
      <module-option name="password-stacking" value="useFirstPass" />
    </login-module>

  </authentication>
</security-domain>
&#13;
&#13;
&#13;

通过执行此操作,jboss安全性将按照在standalone.xml文件(首先是ldap,然后是dblogin)中配置的顺序依次选择登录,并在登录成功时停止

答案 1 :(得分:0)

我记得一年前研究过一个类似的问题并没有找到解决方案。我应用的解决方法是拥有两组jboss-web.xml文件,一组配置了db-domain,另一组配有ldap-domain。要关闭LDAP安全性时,只需运行脚本以使用db-domain 1替换Web xml并重新部署。这是可行的,因为要求是静态的,而不是基于用户输入或动态的。

答案 2 :(得分:0)

对于任何说它是在JAVA下开发的Web应用程序,都有web.xml文件,您可以在其中定义多个安全角色,但是安全身份验证只是其中之一。因此,这意味着一次只能为您的Web应用程序使用一个安全域。尽管JBOSS配置文件可以具有多个Security域,但是在jboss-web.xml中您只能使用一个。请参阅下面的JBOSS文档进行确认: https://docs.oracle.com/cd/E19226-01/820-7627/6nisfjn8c/index.html 进入“指定身份验证机制”:

因此,为了管理下面的两个登录模块,可以做任何事情(下面的任何一个):