7 Oracle Fusion MiddlewareとReal Application Securityの統合
Real Application Securityは、たとえばOracle Fusion Middlewareで使用できるアプリケーション統合用の外部ユーザーおよびロール・サポートを追加します。Oracle Fusion Middlewareでは、認可ポリシー・マネージャを使用してユーザー・インタフェースの集中管理および単一認証でユーザーおよびロールを共通の単一リポジトリに外部化することもできます。Real Application Securityの観点からは、統合ユーザーおよびロール(アプリケーション・ロールを含む)はOracle Fusion Middlewareによって外部的に管理されるため、外部化されたプリンシパルです。中間層の初期化および認可操作は、JavaアプリケーションでのReal Application Securityの使用で説明したものと同じです。
7.1 外部ユーザーおよび外部ロールについて
外部ユーザーは、サービスにアクセスしているエンドユーザーです。ユーザー情報は、一般にWebLogic Authenticatorでインスタンス化するアイデンティティ・ストアに格納されます。このユーザーは、データベース・ユーザーでもReal Application Securityアプリケーション・ユーザーでもありません。外部ユーザーは、データベースにフットプリントを持ちません。ただし、外部ユーザーはアプリケーション・データのデータベースにアクセスする必要があります。したがって、Real Application Securityコンテキスト(セッション)がこのようなユーザーに対して設定され、必要なデータに対するユーザーのアクセスを制御します。
匿名ユーザーは認証されていないユーザー、つまり資格証明が検証されていないユーザーです。匿名ユーザーは、データベースからパブリック・データなどの保護されていないリソースにのみアクセスを許可されます。アプリケーションで、匿名ユーザーの使用を有効または無効にできます。
外部ロールまたはグループとは、ユーザーおよびその他のグループの集合で、階層構造とすることができます。たとえば、グループには、任意にネストしたグループを含めることができます。
外部アプリケーション・ロールとは、ユーザー、グループおよびアプリケーション・ロールの集合で、階層構造とすることができます。このロールはアプリケーション固有であり、アプリケーション・ポリシーで定義するものなので、J2EEコンテナで認識できるとはかぎりません。アプリケーション・ロールは、アプリケーションの実行時にのみ表示されるため、スコープ指定されています。このロールは、同じアプリケーション・スコープで定義されている他のアプリケーション・ロールおよびエンタープライズ・ユーザーまたはグループにマップできます。アプリケーション・ロールは、認可の判断に使用します。
外部ユーザーと同様に、外部ロールおよびアプリケーション・ロールはReal Application Securityシステムにフットプリントを持ちません。これらは、Real Application Security ACLがアプリケーションにデータ・アクセス権を付与する方法の制御に使用されます。
外部ロールおよびアプリケーション・ロールは、データ・アクセスの詳細も施行します。外部ユーザーはいくつかの基本的なデータベース権限を必要とし、通常これはアプリケーション表に対してSELECTを実行するためのオブジェクト権限です。これらの権限は、ユーザー・セッションの連結時に有効になるReal Application Security動的アプリケーション・ロールを通じて付与できます。たとえば、外部ユーザーまたはロールに権限を付与するには、ACLの作成時にACEリストでプリンシパル・タイプをXS_ACL.PTYPE_EXTERNAL
として指定します。詳細は、「CREATE_ACLプロシージャ」を参照してください。
外部ユーザーのセッション・モード
Real Application Securityは、セッションに対して次の2つの操作モードをサポートします。
-
セキュア・モード
セキュア・モードでは、データ・セキュリティがデータベース・サーバーで施行されます。デフォルトでは、セキュア・モードではすべてのユーザーに対して1つのセッションが作成されます。
-
信頼モード
信頼モードは、データ・セキュリティがデータベース・サーバーではなく中間層で施行されるモードです。このようなモードでは、Real Application Securityで実装されるデータ・セキュリティがバイパスされます。このため、信頼モードでのセッションの作成は権限付き操作です。
信頼モードは、ディスパッチャに
CREATE_TRUSTED_SESSION
権限がある場合にのみ、外部ユーザーに対してのみ許可されます。この権限は、ディスパッチャ・ユーザーに対して次のように付与できます。XS_ADMIN_UTIL.grant_system_privilege('CREATE_TRUSTED_SESSION','dispatcher', XS_ADMIN_UTIL.PTYPE_XS);
7.2 外部ユーザーおよびロールのセッションAPI
7.2.1 外部ユーザーのネームスペース
外部ユーザーのネームスペースは、セッションの作成、連結および割当て時に属性操作機能によって強化されます。外部ユーザーは、次のアクティビティを実行できます。
-
セッション作成時のネームスペースおよび属性の作成
-
セッションの連結およびユーザーの割当て時のネームスペース属性の設定
-
セッションの保存と連結の維持
7.2.2 セッションの作成
Real Application Securityアプリケーション・セッションを作成するには、XSSessionManager
クラスのcreateSession
メソッドを使用します。
外部ユーザーの場合、このメソッドはサーバーおよびそれに対応する中間層表現にSessionオブジェクトをネームスペースおよび属性とともに作成します。また、このメソッドはネームスペースを作成し、ネームスペース/属性値で指定された対応する属性を設定します。Cookieを使用して、Cookie値が変更されるかセッションが破棄されるまで、新規に作成されたReal Application Securityアプリケーション・セッションを将来のコールで識別できます。
構文
public abstract Session createSession(java.sql.Connection conn, ExternalUser eUser, java.lang.String cookie, java.util.Collection<NamespaceValue> nav) throws InvalidXSUserException, AccessDeniedException, java.sql.SQLException, XSSessionException, InvalidXSNamespaceException
public abstract Session createSessionTrusted(java.sql.Connection conn, ExternalUser externalUser, java.lang.String cookie, java.util.Collection<NamespaceValue> nameSpaceValues) throws InvalidXSUserException, AccessDeniedException, java.sql.SQLException, SQLException, XSException, InvalidXSNamespaceException
パラメータ
パラメータ | 説明 |
---|---|
|
データベース・サーバー・ラウンドトリップのJDBC接続 |
|
セッションに関連付けられた外部ユーザー |
|
外部ユーザーの識別に使用されるセッションCookie |
|
ネームスペースおよびネームスペースに対して作成する対応属性のリスト |
例
例7-1に、外部ユーザーのReal Application Securityセッションの作成方法を示します。createSession
メソッドは太字で示されています。
例7-1 外部ユーザーのReal Application Securityセッションの作成
. . . static Connection lws_conn =null; static XSSessionManager sm = null; lws_conn = DriverManager.getConnection(lws_conn_string, username, password); sm = XSSessionManager.getSessionManager(privConn,20,29999999); . . . String trituser = "TUSER01"; String cookie = "some_cookie"; String extuser = "ExtPrincp"; String extuuid = "ExtPrincp"; Session lws = null; List<AttributeValue> nsavList = new ArrayList<AttributeValue>(); AttributeValue nsav1 = new AttributeValue("ATTR01","value1"); nsavList.add(nsav1); AttributeValue nsav2 = new AttributeValue("ATTR02","value2"); nsavList.add(nsav2); NamespaceValue nav = new NamespaceValue("NST01",nsavList); List<NamespaceValue> nsList = new ArrayList(); nsList.add(nav); /* create session with external user name in secure mode with namespace attr-vals and cookie */ lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie, nsList); sm.destroySession(lws_conn, lws); /*Create external user session in secure mode*/ lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), null, null); sm.destroySession(lws_conn, lws); /*Create external user session in secure mode with namespace attribute values */ lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), null, nsList); sm.destroySession(lws_conn, lws); /* create session with external user name in secure mode with cookie */ lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie, null); sm.destroySession(lws_conn, lws); /* create trusted session with only external user name */ lws = sm.createSessionTrusted(lws_conn, new ExternalUser(extuser, extuuid), null, null); sm.destroySession(lws_conn, lws); /* create session with RAS user name in secure mode with namespace and cookie */ lws = sm.createSession(lws_conn, trituser, cookie, nsList); sm.destroySession(lws_conn, lws);
7.2.3 セッションの連結
アプリケーション・セッションを連結するには、XSSessionManager
クラスのattachSession
メソッドを使用します。
外部ユーザーの場合、このメソッドはJDBC接続を指定されたセッション・オブジェクトに連結します。このメソッドは、動的アプリケーション・ロール、外部ロール、認証時間を設定し、セッションのネームスペースも作成します。作成および設定するネームスペースおよびその対応するネームスペース属性のリストも付与します。ネームスペースが存在しない場合、このメソッドはネームスペースを作成し、対応する属性を設定します。
構文
public abstract void attachSession( java.sql.Connection conn, Session session, java.util.Collection<java.lang.String> enabledDynamicRoles, java.util.Collection<java.lang.String> disabledDynamicRoles, java.util.Collection<ExternalRole> externalRoles, java.util.Collection<NamespaceValue> nav, java.sql.Timestamp authenticationTime) throws java.sql.SQLException, AccessDeniedException, InvalidSessionException, XSSessionException, InvalidXSNamespaceException public abstract Session attachSessionByCookie( java.sql.Connection conn, java.lang.String cookie, java.util.Collection<java.lang.String> enabledDynamicRoles, java.util.Collection<java.lang.String> disabledDynamicRoles, java.util.Collection<oracle.security.xs.ExternalRole> externalRoles, java.util.Collection<oracle.security.xs.NamespaceValue> namespaceValues, java.sql.Timestamp authenticationTime) throws java.sql.SQLException, AccessDeniedException, InvalidSessionException, XSException, InvalidXSNamespaceException public abstract Session attachSessionByID( java.sql.Connection conn, java.lang.String id, java.util.Collection<java.lang.String> enabledDynamicRoles, java.util.Collection<java.lang.String> disabledDynamicRoles, java.util.Collection<oracle.security.xs.ExternalRole> externalRoles, java.util.Collection<oracle.security.xs.NamespaceValue> namespaceValues, java.sql.Timestamp authenticationTime) throws java.sql.SQLException, AccessDeniedException, InvalidSessionException, XSException, InvalidXSNamespaceException
パラメータ
パラメータ | 説明 |
---|---|
|
アプリケーション・セッションに連結するデータベース接続 |
|
連結するセッション・オブジェクト |
|
セッションCookie |
|
セッション識別子 |
|
有効にする動的アプリケーション・ロール名の集合 |
|
無効にする動的アプリケーション・ロール名の集合 |
|
有効にする外部ロールの集合 |
|
ネームスペースおよび設定する対応属性のリスト |
|
データベース・サーバーに送信する認証時間 |
例
例7-2に、外部ユーザーのReal Application Securityセッションの連結方法を示します。attachSession
メソッドは太字で示されています。
セッションの連結時の外部ロールの動作
-
外部ロールは、セッションに対して有効化された後、セッション・コンテキストの一部をIDとして格納されます。このロールIDは、中間層とデータベース・サーバーの両方に対して
checkAcl
メソッドをコールしたときにアクセス制御で使用されます。これは、通常のReal Application Securityアプリケーション・ロールまたは動的アプリケーション・ロールと同じです。 -
Real Application Security IDは、ロールがACLによって参照されているかどうかにかかわらず、セッションの連結時に渡されたすべての外部ロールに対して割り当てられます。
-
外部ロールのスコープは、セッションの連結または連結解除の境界内です。外部ロールは複数のセッションの連結に対して有効にできないため、明示的に無効にする必要はありません。このため、最初のセッションの連結に割り当てられたロールは、ロールが再び割り当てられないかぎり、次のセッションの連結時に自動的に有効にはなりません。
この動作は、最初のセッションの連結に対して割り当てられたアプリケーション・ロールが次のセッションの連結時に自動的に有効になる標準のReal Application Securityアプリケーション・ロールまたは動的アプリケーション・ロールの動作とまったく異なります。
-
セッションの連結後、外部ロールはセッションを連結解除して再連結するまで整合性を保ちます。ロールはユーザーに対して取り消すこともできます。
例7-2 外部ユーザーのReal Application Securityセッションの連結
. . . static Connection lws_conn =null; static XSSessionManager sm = null; . . . lws_conn = DriverManager.getConnection(lws_conn_string, username, password); sm = XSSessionManager.getSessionManager(privConn,20,29999999); . . . String cookie = "some_cookie"; String extuser = "ExtPrincp"; String extuuid = "ExtPrincp"; Session lws = null; Session lws2 = null List<AttributeValue> nsavList = new ArrayList<AttributeValue>(); AttributeValue nsav1 = new AttributeValue("ATTR01","value1"); nsavList.add(nsav1); AttributeValue nsav2 = new AttributeValue("ATTR02","value2"); nsavList.add(nsav2); NamespaceValue nav = new NamespaceValue("NST01",nsavList); List<NamespaceValue> nsList = new ArrayList(); nsList.add(nav); List <String> dynamicRoles = new ArrayList <String>(); dynamicRoles.add("DYNROLE001"); dynamicRoles.add("DYNROLE002"); List <ExternalRole> extRoles = new ArrayList <ExternalRole>(); extRoles.add(new ExternalRole("EXTPRIN01")); extRoles.add(new ExternalRole("MYEXTPRIN02")); lws = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie + "secure", nsList, false); sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, null, null); sm.detachSession(lws); sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, null, new Timestamp(System.currentTimeMillis())); sm.detachSession(lws); sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, nsList, null); sm.detachSession(lws); sm.attachSession(lws_conn, lws, enabledDynamicRoles, disabledDynamicRoles, extRoles, nsList, new Timestamp(System.currentTimeMillis())); sm.detachSession(lws); lws2 = sm.createSession(lws_conn, new ExternalUser(extuser, extuuid), cookie + "trusted", nsList, true); lws2 = sm.attachSessionByCookie(lws_conn, lws.getSessionCookie(), null, enabledDynamicRoles, disabledDynamicRoles, extRoles, null, null); sm.detachSession(lws2); lws2 = sm.attachSessionByCookie(lws_conn, lws.getSessionCookie(), null, enabledDynamicRoles, disabledDynamicRoles, extRoles, nsList, new Timestamp(System.currentTimeMillis())); sm.detachSession(lws2);
7.2.4 セッションへのユーザーの割当て
以前の匿名ユーザーに名前を割り当てるには、XSSessionManager
クラスのassignUser
メソッドを使用します。
外部ユーザーの場合、このメソッドは以前の匿名ユーザーに指定したユーザーを割り当て、動的アプリケーション・ロール、外部ロールおよび認証時間を設定します。ネームスペース/属性値のリストが指定されている場合、このメソッドは存在しない各ネームスペースを作成し、対応する属性を設定します。
構文
public abstract void assignUser( Session session, ExternalUser targetUser, java.util.Collection<java.lang.String> enabledDynamicRoles, java.util.Collection<java.lang.String> disabledDynamicRoles, java.util.Collection<ExternalRole> externalRoles, java.util.Collection<NamespaceValue> naValues, java.sql.Timestamp authenticationTime) throws java.sql.SQLException, AccessDeniedException, InvalidSessionException, XSSessionException, InvalidXSNamespaceException
パラメータ
パラメータ | 説明 |
---|---|
|
ユーザーを割り当てるセッション・オブジェクト |
|
認証に基づいて初期化される |
|
有効にする動的アプリケーション・ロール名のリスト |
|
無効にする動的アプリケーション・ロール名のリスト |
|
有効にする外部ロールの集合 |
|
ネームスペースおよび設定する対応属性のリスト |
|
ユーザーの認証時に示されたタイムスタンプ |
例
例7-3に、Real Application Securityセッションを外部ユーザーに割り当てる方法を示します。assignUser
メソッドは太字で示されています。
例7-3 Real Application Securityセッションを外部ユーザーに割り当てる方法
. . . static Connection lws_conn =null; static XSSessionManager sm = null; . . . lws_conn = DriverManager.getConnection(lws_conn_string, username, password); sm = XSSessionManager.getSessionManager(privConn,20,29999999); . . . String cookie = "some_cookie"; String extuser = "ExtPrincp"; String extuuid = "ExtPrincp"; Session lws = null; List<AttributeValue> nsavList = new ArrayList<AttributeValue>(); AttributeValue nsav1 = new AttributeValue("ATTR01","value1"); nsavList.add(nsav1); AttributeValue nsav2 = new AttributeValue("ATTR02","value2"); nsavList.add(nsav2); NamespaceValue nav = new NamespaceValue("NST01",nsavList); List<NamespaceValue> nsList = new ArrayList(); nsList.add(nav); List <String> dynamicRoles = new ArrayList <String>(); dynamicRoles.add("DYNROLE001"); dynamicRoles.add("DYNROLE002"); List <ExternalRole> extRoles = new ArrayList <ExternalRole>(); extRoles.add(new ExternalRole("EXTPRIN01")); extRoles.add(new ExternalRole("MYEXTPRIN02")); lws = sm.createAnonymousSession(lws_conn, cookie + "trusted", nsList, true); sm.attachSession(lws_conn, lws, null, null, null, null, null); sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, extRoles, null, null); sm.detachSession(lws); lws = sm.createAnonymousSession(lws_conn, cookie + "secure", nsList, false); sm.attachSession(lws_conn, lws, null, null, null, null, null); sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, extRoles, null, new Timestamp(System.currentTimeMillis())); sm.detachSession(lws); lws = sm.createAnonymousSession(lws_conn, cookie + "trusted", nsList, true); sm.attachSession(lws_conn, lws, null, null, null, null, null); sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, null, nsList, null); sm.detachSession(lws);
7.2.5 セッションの保存とセッションの中止
データベース・サーバーにセッションの変更を保存し、セッションを連結したままにするには、XSSessionManager
クラスのsaveSession
メソッドを使用します。
外部ユーザーの場合、このメソッドは現在のセッションを保存します。detachSession
メソッドと同様に、このメソッドはバック・エンドに対してすべてのセッション変更をコミットし、この操作を実行するにはデータベースのラウンドトリップが必要です。ただし、detachSession
メソッドとは異なり、このメソッドは連結されているセッションを保持します。このメソッドは、主にアプリケーション・コンテキスト(ネームスペース)の保存に使用されます。
データベース・サーバーでセッションの変更を中止し、セッションから連結解除するには、XSSessionManager
クラスのabortSession
メソッドを使用します。
構文
public abstract void saveSession(Session session) throws java.sql.SQLException, NotAttachedException, XSSessionException public abstract void abortSession(Session session) throws java.sql.SQLException, NotAttachedException, XSException
例
例7-4に、Real Application Security外部ユーザー・セッションを保存する方法を示します。saveSession
メソッドは太字で示されています。
例7-4 Real Application Security外部ユーザー・セッションを保存する方法
.
.
.
static Connection lws_conn =null;
static XSSessionManager sm = null;
.
.
.
lws_conn = DriverManager.getConnection(lws_conn_string, username, password);
sm = XSSessionManager.getSessionManager(privConn,20,29999999);
.
.
.
String cookie = "some_cookie";
String extuser = "ExtPrincp";
String extuuid = "ExtPrincp";
Session lws = null;
List<AttributeValue> nsavList = new ArrayList<AttributeValue>();
AttributeValue nsav1 = new AttributeValue("ATTR01","value1");
nsavList.add(nsav1);
AttributeValue nsav2 = new AttributeValue("ATTR02","value2");
nsavList.add(nsav2);
NamespaceValue nav = new NamespaceValue("NST01",nsavList);
List<NamespaceValue> nsList = new ArrayList();
nsList.add(nav);
List <String> dynamicRoles = new ArrayList <String>();
dynamicRoles.add("DYNROLE001");
dynamicRoles.add("DYNROLE002");
List <ExternalRole> extRoles = new ArrayList <ExternalRole>();
extRoles.add(new ExternalRole("EXTPRIN01"));
extRoles.add(new ExternalRole("MYEXTPRIN02"));
lws = sm.createAnonymousSession(lws_conn, cookie + "trusted", nsList, true);
sm.attachSession(lws_conn, lws, null, null, null, null, null);
sm.assignUser(lws, euser, dynamicRoles, dynamicRoles, extRoles, null, null);
lws.deleteNamespace("NST01");
sm.saveSession(lws);