java - 在 JBoss AS 中以编程方式选择登录模块

标签 java authentication jboss jboss7.x

我正在开发一个托管在 JBoss AS 7.1.1 上的 Web 应用程序,该应用程序将由来自两家不同公司的用户使用。

为了进行身份验证,除了用户名和密码之外,用户还必须提供他们所属的公司。
而且,据该公司称,身份验证将针对数据库或 Active Directory 服务器。

我有一个LdapExtLoginModule针对 Active Directory 服务器进行身份验证:

<login-module code="org.jboss.security.auth.spi.LdapExtLoginModule" flag="required" >
    <module-option name="java.naming.provider.url">ldap://ldaphost:389</module-option>
    <module-option name="bindDN">searchuser</module-option>
    <module-option name="bindCredential">password</module-option>
    <module-option name="baseCtxDN">CN=Users,DC=example,DC=com</module-option>
    <module-option name="baseFilter">(sAMAccountName={0})</module-option>
    <module-option name="rolesCtxDN">CN=Users,DC=example,DC=com</module-option>
    <module-option name="roleFilter">(member={1})</module-option>
    <module-option name="roleAttributeID">CN</module-option>
    <module-option name="roleAttributeIsDN">false</module-option>
    <module-option name="roleRecursion">2</module-option>
    <module-option name="searchScope">ONELEVEL_SCOPE</module-option>
    <module-option name="allowEmptyPasswords">false</module-option>
</login-module>

还有一个DatabaseServerLoginModule针对数据库进行身份验证:

<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
    <module-option name="unauthenticatedIdentity" value="guest"/>
    <module-option name="dsJndiName" value="java:/my-ds"/>
    <module-option name="principalsQuery" value="SELECT password FROM users WHERE username = ?"/>
    <module-option name="rolesQuery" value="SELECT DISTINCT role_id, 'Roles' FROM roles WHERE username = ?"/>
</login-module>

根据用户提供的公司,如何管理身份验证并选择正确的登录模块? 感谢您的帮助。

最佳答案

我看到更多可能的方法:

  • 您可以使用 flag=sufficient 在一个域中配置两个登录模块。当第一个登录模块失败时,第二个登录模块将用作后备。那么您就不需要登录时提供的公司名称;

  • Darran 已回复 JBoss forum ,您可以实现您自己的登录模块。你应该想想如何在登录模块中获取公司名称:

    • 读取公司字段值请求对象

      (HttpServletRequest)PolicyContext.getContext("javax.servlet.http.HttpServletRequest")

    • 将公司和用户名放在一起,并使用为基于密码的身份验证机制提供的标准回调来读取用户名和密码。因此,您的用户名可能类似于“company#user”

      如果身份验证类型是 FORM,那么登录表单上很简单有 3 个字段 - companyj_usernamej_password 及之前提交表单时使用 JavaScript 将 company 字段的内容作为提交的 j_username 字段的前缀。

关于java - 在 JBoss AS 中以编程方式选择登录模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308636/

相关文章:

java - Google Drive API - 通过文件 ID 检查文件是否存在

java - hibernate 更新查询

spring - 如何在Grails和现有的oauth2提供程序中使用Spring Security实现基于表单的登录

c# - 身份验证 - 仅允许 HTTPS 方案

java - JBoss AS 7 : How to clean up tmp?

java - weblogic 10.3 上的 ClassCastException jboss-seam

java - android okohttp 将数据插入 php 不起作用

Java 程序不绘制垂直网格

c# - 调试时导致登录重定向缓慢的原因是什么?

java - 用于管理动态属性集的 JMX MBean