我正在开发一个 grails 1.3.7 应用程序,根据设计,客户希望将所有用户保持在数据库级别,因此他可以利用他的数据库在登录、权限等方面的功能。(数据库是 Oracle 10g) .
有没有办法可以将 GORM 配置为在用户登录时使用不同的用户/密码连接到数据库?诸如构建用户/密码表单并将这些凭据传递给 GORM 以连接到数据库之类的东西?
实现此方案的最佳实践是什么?
最佳答案
我不知道 grails,但它使用 Hibernate。
我的想法:
你使用 session 工厂与数据库进行交互,每个 session 工厂都有一个数据源,其中有db的url和le l/p。
因此,您需要为每个用户拥有一个 session 工厂,以便您可以使用不同的身份验证连接到数据库。我没有看到任何更简单的解决方案。
这意味着您需要使用多个数据库/模式的 Multi-Tenancy 应用程序具有相同的要求。除非您不使用不同的数据库/模式,而只是使用不同的 l/p。
看来您正在“单租户模式”下寻找 Multi-Tenancy 插件:
http://www.grails.org/plugin/multi-tenant
Single-Tenant Mode Converts the "dataSource" bean into an AOP proxy that creates a new datasource for each tenant
(最后我错了,您可以使用单个 session 工厂和“动态数据源”^^)
编辑:
http://grails.org/Multi-Tenant+Plugin+-+Single+Tenant+Database+Set+Up
The single-tenant option is a little more immature than the multi-tenant option. It inherits all datasource configuration from the default datasource in Datasource.groovy, and allows you to provide a custom datasource url per tenant. This means that you can't mix and match drivers or user/pass combos for different tenants in the same instance.
似乎最后你不能用插件做到这一点,只能改变网址......正如他们所说的那样它有点不成熟,但你也许可以为那个插件做出贡献,这样就可以改变用户/密码,或者只需检查他们是如何做到的并开发您自己的插件...
...或者也许有人已经开发了...
编辑2:
你还可以做的是:
1) 每次用户登录时,使用用户 l/p 创建一个新数据源并将其添加到数据源池(映射)
(当他注销或 session 到期时,删除该数据源)
2)当您收到用户的请求时,将此用户的 id 放在 threadlocal 中(以过滤器为例)。
3) 创建一个新的数据源实现 MultiAuthentificationDatasourceImpl,您将在其中注入(inject)数据源池,并将所有方法映射到您应该使用的数据库。例如,您的 getConnection() 方法将是:
public Connection getConnection() {
return getDatasourceToUse().getConnection();
}
public Datasource getDatasourceToUse() {
return datasourcePool.get( getUserIdFromThreadLocal() );
}
几乎所有方法都一样,您可以重用 getDatasourceToUse() 方法...
4) 使用 MultiAuthentificationDatasourceImpl 作为 grails 配置中的数据源
但我不知道grails,只是在Java中是可能的......
关于oracle - 在 GORM 中使用不同的数据库用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7195913/