この章では、Oracle Portal付属のAPIを使用してコンテンツのセキュリティを実現する方法について説明します。この章の内容は、次のとおりです。

これらのAPIの詳細は、Portal Centerの『Oracle Portal PL/SQL API Reference』を参照してください。
http://portalcenter.oracle.com
「Portal Focus Areas」セクションで「Portlet Development」をクリックし、次に、「APIs and References」セクションで「PL/SQL API Reference」をクリックします。
| ヒント:Webブラウザまたは外部アプリケーションからAPIをコールする場合、最初にセッション・コンテキストを設定する必要があります。詳細は、10.1項「セッション・コンテキストの設定」を参照してください。 | 
現在オブジェクト用に定義されている権限のリストを取得するには、wwsec_api.grantee_list APIを使用します。例15-1に、IDが33であるページ・グループの、IDが17623であるページの権限受領者配列の値を示します。例15-2に、IDが53であるページ・グループの、マスターIDが32919であるアイテムの権限受領者配列の値を示します。
例15-1 ページの権限リストの取得(grantee_list API)
declare 
  l_grantees         wwsec_api.grantee_array; 
  l_object_type_name varchar2(5)  := wwsec_api.PAGE_OBJ; 
  l_name             varchar2(60) := '33/17623'; 
begin 
  -- Call the function. 
  l_grantees := wwsec_api.grantee_list( 
    p_object_type_name => l_object_type_name, 
    p_name            => l_name 
  ); 
  -- Output the results 
  if l_grantees is not null then 
    if l_grantees.count > 0 then 
      for i in l_grantees.first..l_grantees.last loop 
        if l_grantees.exists(i) then 
          dbms_output.put_line('GRANTEE_TYPE '||to_char(i)||'= 
'||l_grantees(i).GRANTEE_TYPE); 
          dbms_output.put_line('GRANTEE_ID '||to_char(i)||'= 
'||l_grantees(i).GRANTEE_ID); 
          dbms_output.put_line('GRANTEE_NAME '||to_char(i)||'= 
'||l_grantees(i).GRANTEE_NAME); 
          dbms_output.put_line('PRIVILEGE '||to_char(i)||'= 
'||l_grantees(i).PRIVILEGE); 
        end if; 
      end loop; 
    end if; 
  end if; 
exception 
  ... 
end; 
/ 
例15-2 アイテムの権限リストの取得
declare
  l_grantees         wwsec_api.grantee_array;
  p_object_type_name varchar2(5)  := wwsec_api.ITEM_OBJ;
  p_name             varchar2(60) := '53/32919';
begin
  -- Call the function.
  l_grantees := wwsec_api.grantee_list(p_object_type_name, p_name);
  -- Output the results.
  if l_grantees is not null then
    if l_grantees.count > 0 then
      for i in l_grantees.first..l_grantees.last loop
        if l_grantees.exists(i) then
          dbms_output.put.line('GRANTEE_TYPE '||to_char(i)||'= '||l_grantees(i).GRANTEE_TYPE);
          dbms_output.put.line('GRANTEE_ID '||to_char(i)||'= '||l_grantees(i).GRANTEE_ID);
          dbms_output.put.line('GRANTEE_NAME '||to_char(i)||'= '||l_grantees(i).GRANTEE_NAME);
          dbms_output.put.line('PRIVILEGE '||to_char(i)||'= '||l_grantees(i).PRIVILEGE);
        end if;
      end loop;
    end if;
  end if;
exception
  ...
end;
/
grantee_list APIは次の3つのパラメータを取ります。
p_object_type_name: オブジェクトのタイプです。このパラメータの値を指定するには、WWSEC_APIパッケージ内の事前定義済の定数(wwsec_api.PAGE_OBJ、wwsec_api.ITEM_OBJなど)を使用します。
p_name: オブジェクトへの参照です。'<page group ID>/<object ID>'という書式を使用します。したがって、アイテムの場合は、'<page group ID>/<master item ID>'の書式を使用し、'53/32919'のように指定します。
p_owner: オブジェクトを所有するスキーマの名前です。アイテムの場合は、このパラメータの値はデフォルトでPortalスキーマの所有者となるので、このパラメータには値を渡さないでください。
APIにより、次の列を持つ配列(WWSEC_API.GRANTEE_ARRAY)が返されます。
grantee_type: USERまたはGROUP
grantee_id: ユーザーまたはグループの一意のID
grantee_name: ユーザー名またはグループ名
privilege: ユーザーまたはグループに付与された権限
この項では、WWSEC_APIパッケージのAPIを使用してページ・レベルの権限を設定する方法について説明します。
| 注意:次の項に記載されているAPIを使用し、 p_nameパラメータの次の書式を使用することで、タブ・レベルのアクセスを設定することもできます。<page group ID>/<tab ID> コンテナ・ページのIDを指定する必要はありません。タブIDが、ページ・グループ内でタブを識別できるだけの一意性を備えているためです。 | 
例15-3に、set_group_acl APIを使用してグループに権限を付与する方法を示します。例15-4に、set_user_acl APIを使用してユーザーに権限を付与する方法を示します。
例15-3 グループに対するページ権限の付与(set_group_acl API)
declare
  l_group_id number       := wwsec_api.group_id('MYGROUP');
  l_name     varchar2(60) := '33/17623'; 
BEGIN
  wwsec_api.set_group_acl(
    p_group_id         => l_group_id,
    p_object_type_name => wwsec_api.PAGE_OBJ,
    p_name             => l_name,
    p_privilege        => wwsec_api.VIEW_PRIV
  );
end;
/
例15-4 ユーザーに対するページ権限の付与(set_user_acl API)
declare
  l_person_id number      := wwsec_api.id('JOHN.SMITH');
  l_name     varchar2(60) := '33/17623'; 
begin
  wwsec_api.set_user_acl(
    p_person_id        => l_person_id,
    p_object_type_name => wwsec_api.PAGE_OBJ,
    p_name             => l_name,
    p_privilege        => wwsec_api.VIEW_PRIV
  );
end;
/
この2つのAPIは次のパラメータを取ります。
p_group_id: 権限を付与するグループのIDです(set_group_aclのみ)。
p_person_id: 権限を付与するユーザーのIDです(set_user_aclのみ)。
p_object_type_name: 権限を付与するオブジェクトのタイプです。このパラメータの値を指定するには、WWSEC_APIパッケージ内の事前定義済の定数(wwsec_api.PAGE_OBJなど)を使用します。
p_name: オブジェクトへの参照です。'<page group ID>/<page ID>'の書式を使用します。たとえば、'33/17623'のように指定します。
p_privilege: ユーザーまたはグループに付与する権限のレベルです。このパラメータの値を指定するには、WWSEC_APIパッケージ内の事前定義済の定数(wwsec_api.VIEW_PRIVなど)を使用します。
ある時点で、ページからのユーザーまたはグループの権限の削除が必要になる場合があります。例15-5に、remove_group_acl APIを使用してグループの権限を削除する方法を示します。例15-6に、remove_user_acl APIを使用してユーザーの権限を削除する方法を示します。
例15-5 グループのページ権限の削除(remove_group_acl API)
declare
  l_group_id number       := wwsec_api.group_id('MYGROUP');
  l_name     varchar2(60) := '33/17623'; 
BEGIN
  wwsec_api.remove_group_acl(
    p_object_type_name => wwsec_api.PAGE_OBJ,
    p_name             => l_name,
    p_group_id        => l_group_id,
    p_privilege        => wwsec_api.MANAGE_PRIV
  );
end;
/
例15-6 ユーザーのページ権限の削除(remove_user_acl API)
declare
  l_person_id number       := wwsec_api.id('JOHN.SMITH');
  l_name     varchar2(60)  := '33/17623'; 
BEGIN
  wwsec_api.remove_user_acl(
    p_object_type_name => wwsec_api.GROUP_OBJ,
    p_name             => l_name,
    p_person_id        => l_person_id,
    p_privilege        => wwsec_api.MANAGE_PRIV
  );
end;
/
この2つのAPIは次のパラメータを取ります。
p_object_type_name: 権限を削除するオブジェクトのタイプです。このパラメータの値を指定するには、WWSEC_APIパッケージ内の事前定義済の定数(wwsec_api.PAGE_OBJなど)を使用します。
p_name: オブジェクトへの参照です。'<page group ID>/<page ID>'の書式を使用します。たとえば、'33/17623'のように指定します。
p_group_id: 権限を削除するグループのIDです(remove_group_aclのみ)。このページ上の特定の権限をすべてのグループから削除するには、このパラメータをNULLに設定します。
p_person_id: 権限を削除するユーザーのIDです(remove_user_aclのみ)。このページ上の特定の権限をすべてのユーザーから削除するには、このパラメータをNULLに設定します。
p_privilege: ユーザーまたはグループから削除する権限のレベルです。このパラメータの値を指定するには、WWSEC_APIパッケージ内の事前定義済の定数(wwsec_api.VIEW_PRIVなど)を使用します。このページ上のすべての権限をユーザーまたはグループから削除するには、このパラメータをNULLに設定します。
ページに対してアイテム・レベルのセキュリティ(ILS)を有効にしている場合は、ページの個々のアイテムに対してアクセス権限を指定できます。
例15-7に、modify_folder APIを使用してページのILSを有効にする方法を示します。
例15-7 ページのアイテム・レベルのセキュリティの有効化
declare
  l_page     wwsbr_api.page_record;
begin
  select *
  into l_page
  from   <schema>.wwsbr_user_pages
  where  siteid = 33
    and  id = 1
    and  rownum = 1;
  l_page.haveitemsecurity := 1;
  wwsbr_api.modify_folder(
    p_page => l_page
  );
  -- Process cache invalidation messages.
  wwpro_api_invalidation.execute_cache_invalidation;
exception
  ...
end;
/
例15-7で使用されているmodify_folder APIおよびWWSBR_USER_PAGESビューについては、11.1項「ページ・プロパティの編集」を参照してください。
例15-8に、個々のアイテムに対してILSを有効にする方法を示します(これは、Oracle Portalユーザー・インタフェースで「アイテム・レベルのアクセス権限を定義」を選択するのと同じです)。
例15-8 アイテムのアイテム・レベルのセキュリティの有効化(enable_ils_for_item API)
begin
  wwsbr_api.enable_ils_for_item(
    p_master_item_id => 453,
    p_caid           => 33,
    p_folder_id      => 45
  );
  -- Process cache invalidation messages.
  wwpro_api_invalidation.execute_cache_invalidation;
exception
  ...
end;
/
p_master_item_id: アイテムのマスターIDです。この値は、WWSBR_ALL_ITEMSビューのMASTERID列にあります。
p_caid: アイテムが属しているページ・グループのIDです。
p_folder_id: アイテムが表示されるページのIDです。
| ヒント:ILS設定のみでなくアイテムの他の属性も編集するには、かわりに modify_itemまたはmodify_item_post_uploadAPIを使用できます。ILSを有効にするには、p_access_levelパラメータをwwsbr_api.ITEM_ACCESSに設定し、無効にするにはwwsbr_api.FOLDER_ACCESSに設定します。 | 
アイテムに対してILSを有効にすると、1つ以上のユーザーまたはグループのアクセス権限を定義できます。
アイテム・レベルの権限を設定する場合、付与される権限のタイプは、パラメータ値ではなく次のパラメータのどれが渡されるかによって決まります。
ユーザーID配列をp_itemown_userに渡すと、リストのユーザーに対して「管理」権限が付与されます。
ユーザーID配列をp_itemmanage_userに渡すと、リストのユーザーに対して「編集」権限が付与されます。
ユーザーID配列をp_itemview_userに渡すと、リストのユーザーに対して「表示」権限が付与されます。
グループID配列をp_itemown_groupに渡すと、リストのグループに対して「管理」権限が付与されます。
グループID配列をp_itemmanage_groupに渡すと、リストのグループに対して「編集」権限が付与されます。
グループID配列をp_itemview_groupに渡すと、リストのグループに対して「表示」権限が付与されます。
同じプロシージャ・コール内でこれらのパラメータの任意の組合せに値を渡すことで、様々なユーザーやグループに対していろいろな権限を設定できます。
例15-9に、add_item_ils_privileges APIを使用してユーザーにアイテム・レベルの権限を付与する方法を示します。
例15-9 ユーザーへのアイテム・レベルの権限の付与(add_item_ils_privileges API)
declare
  l_itemown_username_array wwsbr_type.array;
  l_itemown_userid_array   wwsbr_type.array;
begin
  l_itemown_username_array(1) := 'jsmith';
  l_itemown_username_array(2) := 'janesmith';
  l_itemown_username_array(3) := 'joedoe';
  for i in 1 .. l_itemown_username_array.count loop
    -- Get the user ID from the wwsec_api.id_sso API.
    l_itemown_userid_array(i) := wwsec_api.id_sso(
      p_username => l_itemown_username_array(i)
    );
  end loop;
  wwsbr_api.add_item_ils_privileges(
    p_master_item_id => 453,
    p_caid           => 33,
    p_folder_id      => 45,
    p_itemown_user   => l_itemown_userid_array
  );
  -- Process cache invalidation messages.
  wwpro_api_invalidation.execute_cache_invalidation;
exception
  ...
end;
/
p_master_item_id: アイテムのマスターIDです。この値は、WWSBR_ALL_ITEMSビューのMASTERID列にあります。
p_caid: アイテムが属しているページ・グループのIDです。
p_folder_id: アイテムが表示されるページのIDです。
p_itemown_user: 「管理」権限を付与するユーザーIDの配列です。
複数の権限配列に同じユーザーまたはグループを渡すと、指定されたうちで最高レベルの権限がそのユーザーまたはグループに付与されます。
| ヒント: add_item_ils_privilegesAPIを使用して、アイテムのアクセス権限を更新することもできます。 | 
なんらかの理由でアイテムに関するユーザーまたはグループの権限を削除する必要がある場合は、例15-10のようにdelete_ils_privilege APIを使用します。
例15-10 アイテム・レベルの権限の削除(delete_ils_privilege API)
declare
  l_user_id       number := 334;
  l_page_group_id number := 75;
  l_page_id       number := 1;
  l_item_id       number := 74637;
begin
  wwsbr_api.delete_ils_privilege(
    p_user_or_group_id => l_user_id,
    p_caid             => l_page_group_id,
    p_folder_id        => l_page_id,
    p_master_item_id   => l_item_id
  );
  -- Process cache invalidation messages.
  wwpro_api_invalidation.execute_cache_invalidation;
exception
  ...
end;
/
p_user_or_group_id: 権限を削除するユーザーまたはグループのIDです。
p_caid: アイテムが属しているページ・グループのIDです。
p_folder_id: アイテムが表示されるページのIDです。
p_master_item_id: アイテムのマスターIDです。この値は、WWSBR_ALL_ITEMSビューのMASTERID列にあります。
独自の権限が定義されているアイテムに、実際には独自の権限ではなく、単にページからの権限を継承するようにする場合は、inherit_folder_privileges APIを使用してILSを無効にします(これは、Oracle Portalユーザー・インタフェースで「親ページのアクセス権限を継承」を選択するのと同じです)。例15-11に、inherit_folder_privileges APIを使用する方法を示します。
15-11 親ページからのアイテム権限の継承(inherit_folder_privileges API)
begin
  wwsbr_api.inherit_folder_privileges(
    p_master_item_id => 453,
    p_caid           => 33,
    p_folder_id      => 45
  );
  -- Process cache invalidation messages.
  wwpro_api_invalidation.execute_cache_invalidation;
exception
  ...
end;
/
p_master_item_id: アイテムのマスターIDです。この値は、WWSBR_ALL_ITEMSビューのMASTERID列にあります。
p_caid: アイテムが属しているページ・グループのIDです。
p_folder_id: アイテムが表示されるページのIDです。
| ヒント:ILS設定のみでなくアイテムの他の属性も編集するには、かわりに modify_itemまたはmodify_item_post_uploadAPIを使用できます。ILSを有効にするには、p_access_levelパラメータをwwsbr_api.ITEM_ACCESSに設定し、無効にするにはwwsbr_api.FOLDER_ACCESSに設定します。 |