我正在开发一个grails 1.3.7应用程序,根据设计,客户希望将所有用户保持在数据库级别,这样他就可以利用他的数据库的登录,权限等功能。(数据库是Oracle 10g)。
有没有办法在用户登录时配置GORM使用不同的用户/通道连接到数据库?像构建用户/传递表单并将这些凭据传递给GORM以连接到数据库?
实施此方案的最佳做法是什么?
答案 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管理的数据库用户进行身份验证)。
您可以使用特定用户进行数据库的全局访问,并编写一个身份验证方案,通过使用自己的用户名和密码创建与数据库的新连接来验证用户。
所以,在这种情况下,你必须有优势: