使用GORM的不同数据库用户

时间:2011-08-25 19:13:35

标签: oracle grails gorm

我正在开发一个grails 1.3.7应用程序,根据设计,客户希望将所有用户保持在数据库级别,这样他就可以利用他的数据库的登录,权限等功能。(数据库是Oracle 10g)。

有没有办法在用户登录时配置GORM使用不同的用户/通道连接到数据库?像构建用户/传递表单并将这些凭据传递给GORM以连接到数据库?

实施此方案的最佳做法是什么?

2 个答案:

答案 0 :(得分:0)

我不知道grails,但它使用Hibernate。

我的想法:

您使用会话工厂与数据库进行交互,并且每个会话工厂都有一个数据源,该数据源具有db和le l / p的url。

因此,您需要为每个用户创建一个会话工厂,以便您可以使用不同的身份验证连接到数据库。我没有看到任何更简单的解决方案。

这意味着您需要使用多个数据库/模式的多租户应用程序具有相同的要求。除了你不使用不同的数据库/模式,只是不同的l / p。

您似乎正在寻找“单租户模式”中的多租户插件: http://www.grails.org/plugin/multi-tenant

  

单租户模式   将“dataSource”bean转换为AOP代理   为每个租户创建一个新的数据源

(最后我错了,你可以使用一个会话工厂和一个“动态数据源”^^)

修改

http://grails.org/Multi-Tenant+Plugin+-+Single+Tenant+Database+Set+Up

  

单租户选项稍微不成熟   多租户选项。它继承了所有数据源配置   Datasource.groovy中的默认数据源,并允许您提供   每个租户的自定义数据源URL。 这意味着你不能混合和   匹配驱动程序或用户/通过组合为不同的租户在同一个   实例

似乎终于你不能用插件做到这一点,只改变网址......正如他们所说的那样有点不成熟但你也许可以为这个插件做出贡献,这样就可以改变用户/密码,或只是检查他们是如何做到这一点并开发自己的插件......

......或者也许有人已经开发出......

<强> EDIT2:

您还可以做的是:

1)每次用户登录时,使用用户l / p创建一个新的数据源并将其添加到数据源池(map) (当他注销或会话过期时,删除该数据源)

2)当你收到用户的请求时,把这个用户的id放在threadlocal中(用例子过滤器)。

3)创建一个新的数据源实现MultiAuthentificationDatasourceImpl,您将在其中注入数据源池,并将所有方法映射到您应该使用的数据库。例如,您的getConnection()方法将是:

public Connection getConnection() {
    return getDatasourceToUse().getConnection();
}

public Datasource getDatasourceToUse() {
   return datasourcePool.get( getUserIdFromThreadLocal() );
}

对于所有方法几乎相同,您可以重用getDatasourceToUse()方法......

4)使用MultiAuthentificationDatasourceImpl作为grails config中的数据源

但是我不知道grails,只有Java才有可能......

答案 1 :(得分:0)

另一种解决方案(如果您的应用程序只有一个数据库,并且只想使用DBMS管理的数据库用户进行身份验证)。

您可以使用特定用户进行数据库的全局访问,并编写一个身份验证方案,通过使用自己的用户名和密码创建与数据库的新连接来验证用户。

所以,在这种情况下,你必须有优势:

  • 单个数据库(每个用户不需要一个SessionFactory,最终会破坏你的应用程序)
  • 所有用户都将由DBMS管理,而不是由您的应用程序管理