Grails每用户数据库身份验证

时间:2012-08-17 14:14:19

标签: grails jdbc groovy

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

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

现在,我的问题在于使用持久化的Connection对象。我知道如果没有大量的自定义,我将无法在GORM中使用它们,因此我计划将它们与groovy.sql.Sql一起使用,这很好,因为大多数业务逻辑都在PL / SQL包中反正。

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

2 个答案:

答案 0 :(得分:2)

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

  

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

因此,如果你想自己做事,而不是完全信任Hibernate,那么SQL类就是如此。虽然,我认为您可以使用Spring的UserCredentialsDataSourceAdapter作为您的解决方案。它使用ThreadLocal为每个线程设置凭据,因此调用:UserCredentialsDataSourceAdapter.setCredentialsForCurrentThread(String username, String password)

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

答案 1 :(得分:1)

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

JDBC Extensions Docs v1.0.0.RC1

JDBC Extensions Docs Base