我正在一个web应用程序上工作,托管在JBoss AS 7.1.1上,这将由来自两个不同公司的用户使用。
为了进行身份验证,除了用户名和密码外,用户还必须提供他们所属的公司。
而且,根据该公司的说法,身份验证将针对数据库或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论坛上回复的,你可以实现你自己的登录模块。您应该考虑如何在登录模块中获取公司名称:
-
读取公司字段值请求对象
(HttpServletRequest) PolicyContext.getContext("javax.servlet.http.HttpServletRequest")
-
将公司和用户名放在一起,并使用为基于密码的身份验证机制提供的标准回调来读取用户名和密码。用户名可以写成"company#user"
如果身份验证类型是FORM,那么在登录表单上有3个字段-
company
,j_username
,j_password
,并且在提交表单之前使用JavaScript在提交的j_username
字段前面加上company
字段的内容。
-