【发布时间】:2011-11-21 07:08:22
【问题描述】:
我目前在一个项目中工作,其中每个用户在 Oracle 11g DB 中都有自己的模式。之所以完成此设计,是因为访问 Oracle 表的所有安全角色和权限都存储在数据库中。我们的团队正在尝试如何在酷炫的 Play 中做到这一点!框架。有什么建议吗?
【问题讨论】:
标签: java oracle jdbc playframework oracle11g
我目前在一个项目中工作,其中每个用户在 Oracle 11g DB 中都有自己的模式。之所以完成此设计,是因为访问 Oracle 表的所有安全角色和权限都存储在数据库中。我们的团队正在尝试如何在酷炫的 Play 中做到这一点!框架。有什么建议吗?
【问题讨论】:
标签: java oracle jdbc playframework oracle11g
据我了解,您可以尝试用类似这样的方式包装 DB.datasource 的值(其中 currentUser() 和 currentPassword() 应该返回发出请求的当前用户的凭据):
public class DataSourceWrapper {
private DataSource original;
public DataSourceWrapper(DataSource original) {
this.original = original;
}
public Connection getConnection() {
return original.getConnection(currentUser(), currentPassword());
}
...
public DataSource getOriginal() {
return original;
}
}
DB.datasource 的替换应该发生在 DB 和 JPA 插件的 onApplicationStart() 方法执行之间,因此您需要创建自定义插件:
public class DataSourceReplacementPlugin extends PlayPlugin {
public void onApplicationStart() {
DB.datasource = new DataSourceWrapper(DB.datasource);
}
public void onApplicationStop() {
if (DB.datasource instanceof DataSourceWrapper) {
DB.datasource = ((DataSourceWrapper) DB.datasource).getOriginal();
}
}
}
并在conf/play.plugins 中以适当的优先级注册:
350: DataSourceReplacementPlugin
【讨论】:
DB.datasource,我犹豫了。这不会杀死并发吗?
getConnection() 来获取新连接,因此上述解决方案应该是正确的(如果有效)。此外,Play 没有通常意义上的会话(由于其“无共享”架构),因此您无法在其中存储连接。连接的缓存由池化数据源执行。