JBossとOracleを使用して真の読み取り専用データソースを定義する方法はありますか?
単一のデフォルトスキーマユーザーに固執したいのですが、SQLインジェクションの問題をまったく回避するために、アプリケーションの特定の部分を読み取り専用に制限します。JBossにそのような方法がない場合は、Oracleで制限された権限を持つ別のユーザーを作成する必要があります。
JBossでそれができるかどうかにかかわらず、とにかく2番目のユーザーを作成する必要があります。
データベースのアクセス許可は、データベースレイヤーで設定する必要があります。それらをコードに適用しようとしないでください。データベースは、書き込み権限のないテーブルへの書き込みが不可能になるように設計されています。これをアプリケーションに実装すると、この制限を破るのに小さな変更または小さなバグが必要になります。
別のスキーマのテーブルを参照したくない場合は、いつでもそれを指すシノニムを独自に作成できます。
あなたが面白いと思うかもしれない関連するプログラマーの質問があります。簡単に言うと、 「SQLサーバーをうまく機能させることができることをコードで実行しないでください」。この特定のシナリオは言及されていませんが、私はそれが当てはまると思います。
これを完了するには...次の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;
これにより、他のユーザーのテーブルを同じユーザーであるかのようにクエリできます。
それでおしまい。