如何定义Oracle JBoss DataSource仅限于只读?

时间:2012-11-08 15:11:05

标签: java oracle jboss

有没有办法使用JBoss和Oracle定义真正的只读数据源?

我想坚持单个默认架构用户,但将应用程序的某些部分限制为只读,以避免SQL注入问题。如果在JBoss中没有这种方法,我将不得不在Oracle中创建另一个具有有限权限的用户。

2 个答案:

答案 0 :(得分:4)

无论你是否可以在JBoss中完成,你都应该创建第二个用户。

应在数据库层中设置数据库权限;不要试图在代码中应用它们。数据库的设计旨在确保无法写入您没有写入权限的表。如果你在应用程序中实现它,只需要一个小的改动或一个小的bug来打破这个限制。

如果您不想引用另一个模式中的表,您可以随时创建一个指向它的同义词。

有一个related programmers question您可能会感兴趣。简单地说“永远不要在代码中做什么,你可以让SQL服务器为你做好”。没有提到这个具体情况,但我认为它适用。

答案 1 :(得分:0)

要完成此操作...我已使用以下SQL创建了另一个用户:

-- USER SQL
CREATE USER MYUSER_READONLY IDENTIFIED BY password 
DEFAULT TABLESPACE "USERS"
TEMPORARY TABLESPACE "TEMP";

-- ROLES
GRANT "AUTHENTICATEDUSER" TO MYUSER_READONLY;
GRANT "CONNECT" TO MYUSER_READONLY;
GRANT "EJBCLIENT" TO MYUSER_READONLY;
GRANT SELECT ANY TABLE TO MYUSER_READONLY;
GRANT ALTER SESSION TO MYUSER_READONLY;

为了在我的Java代码中简化此用户的使用,我们使用以下语句初始化每个SQL会话:

ALTER SESSION SET CURRENT_SCHEMA = MYUSER;

这允许我们查询该另一个用户的表,就好像它是同一个用户一样。

就是这样。