2011-11-03 83 views
0

在我们的应用程序中,我们需要让用户在使用基于表单的身份验证进行登录时选择所需的数据源,并且我不确定在使用基于标准表单的身份验证时它是否完全可能。我听说有可能使用TextInputCallback,但不知道如何(以及在​​哪里)实现它。将附加参数传递给j_security_check

+0

TextInputCallback是JAAS的一部分。 – EJP

回答

0

web.xml中最多可以有一个<login-config>标签。这意味着您不能在一个Web应用程序中使用多个领域。所以,你需要一个或多或少的容器特定的解决方案。

在Tomcat中有一个CombinedRealm可以使用其他领域。

包含一个或多个领域的领域实现。每个领域的验证 都按照它们配置的顺序进行尝试。如果有任何 领域认证用户,那么认证成功。当 组合领域用户名在所有组合的 领域中应该是唯一的。

也许它符合您的要求。如果不是,并且用户存在于多个领域(使用相同的用户名),则可以使用前缀。例如,设置"domain\myuser"作为用户名。

如果您使用嵌套的JDBCRealm,您可以创建一个数据库视图,其中包含前缀用户名(只需使用用户名连接前缀)并将此视图用作用户表。

另一种方法是删除自定义领域中的前缀并调用容器的JDBCRealm(或其他领域),但它需要一些编码。无论如何,它不应该太难,已经存在的领域可能可以与代表设计模式一起使用。

+0

如果我的想法正确无误,我需要修改数据库来执行此操作。但是如何使用Spring的AbstractRoutingDataSource在它们之间切换?这是一个迁移/集成项目,所以我们不能改变数据库设置,也不能添加任何新的东西。 – Sergey

+0

如果使用'CombinedRealm'并且数据库不包含相同的用户名,则不必创建新视图。如果您使用'CombinedRealm'并且数据库包含相同的用户名,则可以编写自定义领域(无需修改数据库)。我不知道Spring的'AbstractRoutingDataSource'。 – palacsint