2012-08-17 59 views
3

首先,我知道最好的做法是在您的Web应用程序中使用单个数据库用户帐户,以利用连接池来保持应用程序的良好响应。但是,由于要求(因为在任何情况下都没有改变),我必须使用他或她的数据库账户来验证每个用户。Grails每用户数据库身份验证

上下文是一个在Android上运行的仓库管理应用程序,但从Web服务获取其数据,我可能要写在Grails中,除非这里的建议显示了我更适合我的需求的技术。由于应用程序的性质,用户可能只需要每天验证一次或两次,所以我想我可以简单地将连接保存在由密码连接的用户名的哈希码密钥的HashMap中。这应该允许应用程序保持与最佳实践相同或相似的性能级别。

现在,我的问题是在使用持久连接对象。我知道如果没有大量的定制,我将无法将它们用于GORM,所以我打算将它们与groovy.sql.Sql结合使用,因为大部分业务逻辑都在PL/SQL包中无论如何。

我的问题是如何处理它的连接对象的groovy.sql.Sql类?我会遇到由它关闭的Connections问题,还是我可以安全地使用我的HashMap来保持连接?

+1

我不认为你可以安全地做到这一点。如果你的连接被数据库本身关闭(比如不活动)呢?你失去了连接并永远无法恢复,因为你需要它来访问数据库。 – 2012-08-17 14:56:21

+0

好的。我还考虑实现一个类似连接池的构造来存储HashMap,它将处理意外的并发和DB关闭连接等事情。我只需要知道groovy.sql.Sql不会关闭它们。 – Stuporman 2012-08-17 15:08:45

+0

大多数连接池也可以根据用户名和密码进行池化(或者只是传递它)。 – 2012-08-18 06:37:40

回答

2

groovy.sql.Sql不会关闭您的连接。在类规范中,您可以找到:

如果此SQL对象是使用Connection创建的,则此方法 将关闭连接。

因此,SQL类是真的如果你想自己做事情,而不是完全信任Hibernate。虽然,我认为你可以使用Spring的UserCredentialsDataSourceAdapter来解决问题。它使用ThreadLocal为每个线程设置凭证,因此致电:UserCredentialsDataSourceAdapter.setCredentialsForCurrentThread(String username, String password)

将解决。还有其他的方法可以尝试here

+0

有趣。我会检查这些,并让你知道它是如何工作的。目前看起来很有希望。 – Stuporman 2012-08-17 17:13:02

+0

我对Grails和Spring很陌生,我不知道如何使用UserCredentialsDataSourceAdapter。你有任何推荐的阅读材料,让我迅速加快速度? – Stuporman 2012-08-17 17:55:31

+0

没关系。现在我看到你链接的线程有方向了。 – Stuporman 2012-08-17 19:28:48

1

我其实只是发现了一些未来这个问题的访问者可能会觉得有用的东西。在深入研究Spring Framework的文档时,我发现他们的JDBC Extensions实际上实现了代理验证(其中使用代理帐户建立连接,但为SQL执行的上下文提供了实际帐户)。不幸的是,2012年8月17日的实施不支持通过代理连接为用户使用密码,因此目前对我来说它不会使用,但任何发现此问题的人都应该检查是否仍然如此。这里是链接:

JDBC Extensions Docs v1.0.0.RC1

JDBC Extensions Docs Base