3.15.9 アクセス制御機能に関する操作

アクセス制御機能を使用するため,アクセス制御情報を操作する場合に使用するメソッドと,そのメソッドの発行順序の例を説明します。

ここでは,次の操作について説明します。

なお,これらの操作を実行する前に,まず,文書空間と接続してトランザクションを開始してください。

それぞれの操作に使用するメソッドの詳細については,マニュアル「DocumentBroker Version 3 クラスライブラリ C++ リファレンス 基本機能編」を参照してください。

<この項の構成>
(1) ACFlagの設定
(2) ACE,ACLの作成と設定
(3) 文書またはコンテナへのACLの設定
(4) パブリックACLの作成
(5) 文書またはコンテナへのパブリックACLの設定
(6) 文書またはコンテナへのパブリックACLのバインド

(1) ACFlagの設定

ACFlagは,クラスライブラリのオブジェクトのプロパティである,dbrProp_OwnerPermissionプロパティ,dbrProp_PrimaryGroupPermissionプロパティおよびdbrProp_EveryonePermissionプロパティとして設定します。これらの設定方法は,ほかのプロパティの設定方法と同じです。プロパティの設定については,「2.6.6 プロパティの操作」を参照してください。

ただし,ACFlagが設定できるのは,設定しようとしているクラスライブラリのオブジェクトの所有者,セキュリティACLに登録されているユーザまたはセキュリティ管理者だけです。

(2) ACE,ACLの作成と設定

ACEは,可変長配列の個々の要素を表すCdbrCompoundクラスのオブジェクトのプロパティとして設定します。それぞれ,サブジェクトをdbrProp_Subjectプロパティに,サブジェクト種別をdbrProp_SubjectTypeプロパティに,パーミッションをdbrProp_Permissionプロパティに設定します。

ACLは可変長配列を表すVariableArray型プロパティです。CdbrVariableArrayクラスのオブジェクトとして作成します。

ここでは,CdbrDocumentオブジェクトとして作成した文書に対して,USER_Aというユーザ識別子を持つユーザに参照更新権を設定する場合について説明します。

準備
ローカルACLを設定するオブジェクトのOIIDを検索などによってあらかじめ取得しておきます。検索については,「4. オブジェクトの検索」を参照してください。
  1. CdbrCompoundクラスのオブジェクトのACEを表すプロパティ(dbrProp_Subjectプロパティ,dbrProp_SubjectTypeプロパティ,dbrProp_Permissionプロパティ)に,それぞれサブジェクト,サブジェクト種別,パーミッションを設定します。
  2. 1.で作成したCdbrCompoundオブジェクトを,CdbrVariableArrayクラスのオブジェクトの要素として設定します。
  3. 2.をSDBR_PROP構造体のuniValue.ppObjectに設定します。
  4. 3.をSDBR_PROPLIST構造体に格納して,PutPropertyValuesメソッドの引数として,メソッドをコールします。

ACE,ACLを作成して,オブジェクトのローカルACLとして設定するコールシーケンスの例を次に示します。

ACE,ACLを作成して,オブジェクトのローカルACLとして設定するコールシーケンス

// 変数DocumentはCdbrDocumentクラスから作成した文書
SDBR_PROP     Prop;
SDBR_PROPLIST PropList;
Dmapv         pObj;
CdbrCompound ACE;
CdbrVariableArray  ACL(DBR_DATATYPE_COMPOUND);
pSession->Begin();
Document.SetOIID(pSession, pOIID);
// ACEにサブジェクト,サブジェクト種別およびパーミッションを設定する
ACE.SetValue(&dbrProp_Subject, "USER_A");
ACE.SetValue(&dbrProp_SubjectType, DBR_SUBJECTTYPE_USR);
ACE.SetValue(&dbrProp_Permission, DBR_PERM_READ_WRITE);
// ACLの要素数を1にして,ACEをACLに格納する
ACL.Resize(1);
ACL.SetValue(0,ACE);
// ACLをプロパティ構造体に設定する
Prop.PropId = dbrProp_ACL;
Prop.lType = DMA_DATATYPE_OBJECT;
Prop.lCardinality = EDM_DMA_CARDINALITY_VARRAY;
Prop.lCount = 1;
pObj = &ACL;
Prop.uniValue.ppObject = &pObj;
// プロパティ構造体の値(=ACL)をDMAオブジェクトに設定する
PropList.pItem = &Prop;
PropList.lCount = 1;
Document.PutPropertyValues(&PropList);
Document.ReleaseObject();
pSession->Commit();

(3) 文書またはコンテナへのACLの設定

VariableArray型プロパティであるACLを文書またはコンテナのローカルACLに設定する場合は,PutPropertyValuesメソッドをコールして設定します。操作の詳細については,「2.6.7 VariableArray型プロパティの操作」を参照してください。

ただし,ACLをオブジェクトに設定できるのは,ローカルACLを設定しようとしている文書やコンテナの所有者,セキュリティACLに登録されているユーザまたはセキュリティ管理者だけです。

(4) パブリックACLの作成

パブリックACLは,文書やコンテナなどのオブジェクトと同じように,CreateObjectメソッドをコールして作成します。メソッドの発行順序については,「3.2.3(1) 文書の作成」を参照してください。ここでは,パブリックACLを作成する場合の準備について示します。

準備
オブジェクトの構成要素になるDMAオブジェクト作成用のクラス識別子を指定した構造体(SDBR_DMAINFO構造体)を作成しておきます。
このとき,ClassIdにはedmClass_PublicACLクラスのクラス識別子を指定します。これ以外のクラスは指定できません。
また,設定するACLをプロパティ構造体(SDBR_PROP)に設定して,プロパティリスト構造体(SDBR_PROPLIST)に設定します。これを,SDBR_DMAINFO構造体に設定しておきます。

(5) 文書またはコンテナへのパブリックACLの設定

作成したパブリックACLを文書やコンテナからバインドする場合の操作について説明します。

ここでは,CdbrDocumentオブジェクトからパブリックACLをバインドする場合について説明します。

なお,パブリックACLをオブジェクトにバインドできるのは,バインドしようとしているオブジェクトの所有者,セキュリティACLに登録されているユーザまたはセキュリティ管理者だけです。

準備
パブリックACL(CdbrPublicACLオブジェクト)の構成要素であるedmClass_PublicACLクラスのオブジェクトのOIIDを,検索などによってあらかじめ取得しておきます。
  1. CdbrCompoundクラスのオブジェクトのdbrProp_ACLIdElemプロパティに,バインドするパブリックACLのOIIDを設定します。
  2. VariableArray型プロパティとして,CdbrVariableArrayオブジェクトの構成要素に1.を設定します。
  3. 2.をSDBR_PROP構造体のuniValue.ppObjectに設定します。このプロパティ構造体を,SDBR_PROPLIST構造体に設定して,PutPropertyValuesメソッドをコールします。

パブリックACLをCdbrDocumentオブジェクトからバインドするコールシーケンスの例を次に示します。

CdbrDocumentオブジェクトにパブリックACLを設定するコールシーケンス

SDBR_PROP     Prop;
SDBR_PROPLIST PropList;
Dmapv         pObj;
CdbrDocument  Document;
CdbrCompound  PublicACLOIID1,PublicACLOIID2;
CdbrVariableArray  Varray(DBR_DATATYPE_COMPOUND);
pSession->Begin();
Document.SetOIID(pSession, pOIID);
//パブリックACLのOIIDを可変長配列の要素として指定する
PublicACLOIID1.SetValue(&dbrProp_ACLIdElem,pPubOIID1);
PublicACLOIID2.SetValue(&dbrProp_ACLIdElem,pPubOIID2);
//VariableArrayプロパティの要素数を設定する
Varray.Resize(2):
//要素を設定する
Varray.SetValue(0,PublicACLOIID1);
Varray.SetValue(1,PublicACLOIID2);
//OIIDリスト(VariableArray型プロパティ)を
//プロパティ構造体に設定する
Prop.PropId = dbrProp_PublicACLIds,
Prop.lType = DMA_DATATYPE_OBJECT;
Prop.lCardinality = EDM_DMA_CARDINALITY_VARRAY;
Prop.lCount = 1;
pObj = &Varray;
Prop.uniValue.ppObject = &pObj;
//プロパティ構造体の値をCdbrDocumentオブジェクトに設定する
PropList.pItem = &Prop;
PropList.lCount = 1;
Document.PutPropertyValues(&PropList);
Document.ReleaseObject();
pSession->Commit();

(6) 文書またはコンテナへのパブリックACLのバインド

文書やコンテナがすでにパブリックACLをバインドしている場合,PutPropertyValuesメソッドによってパブリックACLを追加すると,それまでバインドしていたパブリックACLはアンバインドされます。

ここでは,文書やコンテナに設定された既存のパブリックACLに,ほかのパブリックACLを追加してバインドする場合の操作について説明します。

ここでは,CdbrDocumentオブジェクトにパブリックACLを追加してバインドする場合について説明します。

なお,パブリックACLをオブジェクトからバインドできるのは,バインドしようとしているオブジェクトの所有者,セキュリティACLに登録されているユーザまたはセキュリティ管理者だけです。

準備
パブリックACL(CdbrPublicACLオブジェクト)の構成要素であるedmClass_PublicACLクラスのオブジェクトのOIIDを,検索などによってあらかじめ取得しておきます。
  1. CdbrDocumentオブジェクトに接続します。
    CdbrDocument::SetOIIDメソッドまたはCdbrDocument::ConnectObjectメソッドをコールします。
  2. CdbrDocumentオブジェクトとCdbrPublicACLオブジェクトをバインドします。
    CdbrDocument::BindPublicACLメソッドをコールします。
    これによって,CdbrDocumentオブジェクトとCdbrPublicACLオブジェクトがバインドされ,CdbrDocumentオブジェクトのVariableArray型プロパティであるdbrProp_PublicACLIdsプロパティにOIIDが設定されます。
CdbrDocumentオブジェクトにパブリックACLをバインドするコールシーケンス

pSession->Begin();
//…
//検索によってバインドするパブリックACLのOIIDを取得する
//…
CdbrDocument Document;
pDmaString_T ppIdList[2];
DmaInteger32 lIdListCount;
//CdbrDocumentオブジェクトに接続する
Document.SetOIID(pSession, pOIID);
//CdbrDocumentオブジェクトとパブリックACLをバインドする
lIdListCount = 2;
ppIdList[0] = pPubOIID1;
ppIdList[1] = pPubOIID2;
Document.BindPublicACL(lIdListCount,ppIdList);
Document.ReleaseObject();
pSession->Commit();