我正在开发一个托管在 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 个字段 -
company
、j_username
、j_password
及之前提交表单时使用 JavaScript 将company
字段的内容作为提交的j_username
字段的前缀。
关于java - 在 JBoss AS 中以编程方式选择登录模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25308636/