ヘッダーをスキップ

Oracle Containers for J2EE セキュリティ・ガイド
10g(10.1.3.1.0)

B31857-01
目次
目次
索引
索引

戻る 次へ

12 ユーザーおよびロールAPIフレームワーク

OC4J 10.1.3.x実装は、様々なID管理リポジトリにあるユーザーとロールの情報にアクセスするための新しいプラッガブルなID管理APIフレームワークを提供します。これは、第13章で説明するプラッガブルなID管理フレームワークとは無関係です。そこで、このフレームワークとの混同を避けるため、この章ではこのAPIを「ユーザーおよびロールAPI」と呼びます。

このAPIには、com.evermind.securityパッケージの非推奨クラスであるUserManagerUserおよびGroupにかわる機能が含まれています。

この章の内容は次のとおりです。

ユーザーおよびロール(ID管理)APIフレームワークの概要

ユーザーおよびロールAPIフレームワークを使用すると、基礎となるIDリポジトリの種類に関係なく、一貫した移植可能な方法でアプリケーションがID情報(ユーザーおよびロール)にアクセスできます。基礎となるリポジトリは、Oracle Internet Directory、Active Directory(Microsoft社提供)、Sun Java System Directory Server(Sun社提供)などのLDAPディレクトリ・サーバー、データベース、フラット・ファイルまたは他のカスタム・リポジトリのいずれでも可能です。

このAPIフレームワークは、移植可能な方法でプログラムからリポジトリにアクセスするための便利な手段を提供します。その結果としてアプリケーション開発者は、個々のIDソースの複雑さを考慮するという困難な作業から解放されます。このフレームワークにより、様々なリポジトリに対してアプリケーションがシームレスに動作するようになります。アプリケーションは、コードを一切変更することなく、各種IDリポジトリ間の切替えができます。

サポートされている操作には、ユーザーとロールの作成、更新、削除、ユーザーとロールの属性の検索、関連情報の検索があります。たとえば、特定のロールに属するすべてのユーザーの電子メール・アドレスを検索できます。これらのAPIは、認証または認可機能用ではありません。

基本使用モデル(OC4J統合なし)またはコードを移植可能にするOC4J統合の使用モデルが使用できます。

UserManager、User、GroupにかわるユーザーおよびロールAPIの機能

ユーザーおよびロールAPIには、非推奨のcom.evermind.security.UserManagerUserGroupの各クラスの機能にかわる機能が含まれています。

ユーザーおよびロールAPIフレームワークとプロバイダ

ユーザーおよびロールAPIは、JNDIに似たフレームワークとプロバイダ・モデルに基づいています。

このフレームワークは、ID情報にアクセスするための汎用的なメカニズムを規定し、Javaインタフェースだけで構成されます。実装の詳細は提供しません。

各プロバイダ(OC4J付属)は、特定のリポジトリの情報にアクセスする(Active DirectoryからID情報を読み取る場合など)ための特定の実装クラスにより、フレームワーク・インタフェースを実装します。IDリポジトリのタイプごとに、対応するプロバイダが存在します。

アプリケーション開発者は、汎用フレームワークに基づいてコードを作成します。その後の構成手順で、アプリケーションは目的のIDリポジトリに対する適切なプロバイダにプラグインされます。別のリポジトリを使用するよう、後からアプリケーションを更新することができます。その場合、対応するプロバイダを使用するようにアプリケーションを再構成するだけです。アプリケーション・コードを変更する必要はありません。

OC4Jには、Oracle Internet Directory、Active Directory、Sun Java System Directory Server(以前のiPlanet)、Novell eDirectory、OpenLDAP(オープン・ソースのLDAPディレクトリ)用の各プロバイダが付属しています。次の図12-1は、数個の特定のプロバイダに対するフレームワークを表しています。

図12-1    ユーザーおよびロールAPIフレームワーク・モデル


画像の説明

ユーザーおよびロールのインタフェースとクラスの概要

この項では、ユーザーおよびロールAPIパッケージoracle.security.idmのインタフェースとクラスの概要を説明します。

関連資料

  • 『Oracle Containers for J2EE User and Role Java API Reference』(Javadoc)

 

ユーザーおよびロール・インタフェースの説明

この項では、oracle.security.idmパッケージのインタフェースの概要を説明します。

IDリポジトリに対するインタフェースは次のとおりです。

IDリポジトリ内のユーザー・エントリに対するインタフェースは次のとおりです。

IDリポジトリ内のロールに対するインタフェースは次のとおりです。

ユーザーおよびロール・クラスの説明

この項では、oracle.security.idmパッケージ内の主要なクラスの概要を説明します。

ユーザーおよびロールAPIの使用モデル

この項では、基本的なAPIフレームワークとOC4J統合機能を使用するための手順を説明し、そのサンプルを示します。この項の内容は次のとおりです。

手順説明: 基本の使用モデル

この項では、基本的なAPIフレームワークを使用する手順を説明します。手順1と2は主に構成に関連し、使用されるプロバイダとその構成を判別します。この2つの手順で示すコードは、IDリポジトリとプロバイダによって異なります。手順3でリポジトリに対して実行される操作は、汎用的な操作です。別のリポジトリに変更しても、このコードには影響しません。

関連項目

 

  1. IdentityStoreFactoryインスタンスを取得します。このファクトリ・インスタンスはIDリポジトリを表し、IdentityStoreFactoryBuilderインスタンスでgetIdentityStoreFactory()コールを使用して作成されます。このコールは、特定のIDリポジトリに接続する際に使用されるプロバイダの名前を受け取ります。また、このプロバイダが必要とする構成情報も指定します。

    たとえば、アプリケーションでOracle Internet Directoryに接続する必要があるとします。Oracle Internet Directoryのプロバイダ名は次のとおりです。

    oracle.security.idm.providers.oid.OIDIdentityStoreFactory
    

    Oracle Internet DirectoryなどのLDAPプロバイダには、LDAPのURL、セキュリティ・プリンシパル、資格証明などの構成情報が必要です。次に例を示します。

    IdentityStoreFactoryBuilder builder =
                                new IdentityStoreFactoryBuilder();
    IdentityStoreFactory oidFactory = null;
     
    Hashtable factEnv = new Hashtable();
     
    // creating the factory instance
    // set the configuration information
    factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL, "cn=orcladmin");
    factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS, "welcome1");
    factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL,
             "ldap://ilinabc10.us.oracle.com:3060/");
    factEnv.put(OIDIdentityStoreFactory.ST_LOGGING,"false");
    factEnv.put(OIDIdentityStoreFactory.ST_LOG_LEVEL,
            java.util.logging.Level.ALL);
    oidFactory =  builder.getIdentityStoreFactory(
            "oracle.security.idm.providers.oid.OIDIdentityStoreFactory", factEnv);
    
  2. IdentityStoreインスタンスを取得し、リポジトリで操作を実行します。これを取得するには、IdentityStoreFactoryインスタンスでgetIdentityStoreInstance()コールを使用します。このコールは、IDストア・インスタンスの作成に必要な構成情報を受け取ることができます。たとえばOracle Internet Directoryの場合、次の例で示すように、操作が実行されるサブスクライバまたはレルムの名前を指定する必要があります。

    Hashtable storeEnv = new Hashtable();
     
    // creating the store instance
    storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME, 
                                  "dc=us,dc=oracle,dc=com");
    oidStore = oidFactory.getIdentityStoreInstance(storeEnv);
    
  3. IdentityStoreインスタンスを使用して、エントリの検索、更新、作成、削除などの操作をIDリポジトリで実行します。たとえば次のコードでは、名前がjohnで始まるすべてのユーザーが検索されます。

    // search filter for users whose name begins with "john"
    SimpleSearchFilter sf = oidStore.getSimpleSearchFilter(
            UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null);
     
    // Add the wildcard character
    sf.setValue("john"+sf.getWildCardChar());
     
    // generate the search parameter instance and set the search filter 
    SearchParameters params = new SearchParameters();
    params.setFilter(sf);
     
    // Searching for users
    // search on the IdentityStore instance 
     
    SearchResponse resp = oidStore.searchUsers(params);
    System.out.println("Searched users are:");
     
    // Iterate on the search results
    while (resp.hasNext()
    {
      User usr = (User) resp.next();
      System.out.println("Name: "+usr.getName());
    }
    

手順説明: OC4J統合の使用モデル

前項の「手順説明: 基本の使用モデル」で説明したように、構成に関連するコードはIDリポジトリとそれに関連するプロバイダによって制限されるため、アプリケーションで使用するIDリポジトリを変更する場合は、コードも必ず変更する必要があります。

コードを移植可能にするには、APIフレームワークのOC4J統合機能を使用します。この機能は、アプリケーションのOC4Jログイン・モジュールにあるセキュリティ・プロバイダ情報を使用するため、アプリケーションでリポジトリやプロバイダの構成を指定する必要がなくなります。その結果、アプリケーション・コードは汎用的になり、ログイン・モジュール構成でセキュリティ・プロバイダ情報を変更するだけで、アプリケーションで使用するIDソースを変更できるようになります。


重要

OC4J統合機能はセキュリティに関連する操作であるため、アプリケーションに必要なパーミッションが設定されている必要があります。java2.policyの要件は、次項の「OC4J統合機能に対するパーミッション要件」を参照してください。 


関連項目

 

OC4J統合機能は、次の手順で使用します。

  1. ユーザーおよびロール・フレームワークで、ユーザー/ロール・プロパティ・ファイル(一般的な名前はuserrole.properties)へのパスを、次のようにJavaシステム・プロパティとして指定する必要があります。

    System.setProperty("oracle.userrole.properties",
                       "/home/jdoe/userrole.properties");
    

    プロパティ・ファイルには、フレームワークでOC4Jログイン・モジュール情報へアクセスする際に必要な設定が格納されています。プロパティ・ファイルの形式は、「ユーザーおよびロール・プロパティ・ファイル」で示しています。

  2. IdentityStoreFactoryインスタンスの作成は権限を必要とする操作であり、次のようにAccessController.doPrivileged()ブロック内で実行する必要があります。

    IdentityStoreFactory factory = null;
     
    try
    {
      factory = (IdentityStoreFactory) AccessController.doPrivileged(
                     new PrivilegedExceptionAction()
                     {
                       public Object run() throws IMException
                       {
                         IdentityStoreFactoryBuilder builder = 
                                      new IdentityStoreFactoryBuilder();
                         return builder.getIdentityStoreFactory();
                       }
                     });
      
    }catch (PrivilegedActionException e)
    {
      e.getException().printStackTrace(out);
    }
    catch (Exception e) 
    {
      e.printStackTrace(out);
    } 
    
  3. 次のように、IdentityStoreインスタンスは簡単に取得できます。

    IdentityStore store = factory.getIdentityStoreInstance();
    
  4. 前項の「手順説明: 基本の使用モデル」で示したように、IDストアに対して操作を実行します。

OC4J統合機能に対するパーミッション要件

OC4J統合機能はセキュリティに関連する操作であるため、アプリケーション・コードに一定のパーミッションが必要となります。具体的には、IdentityStoreFactoryBuilderクラスのgetIdentityStoreFactory()メソッドで、一定のパーミッションを必要とするAPIコールが行われます。

OC4Jのjava2.policyファイルで、次のパーミッションをアプリケーション・コードベースに付与します。

grant codebase "file:${oracle.home}/application_code_base" 
{
    permission oracle.security.jazn.JAZNPermission "*";
};

Java 2ポリシーを使用するには、セキュリティ・マネージャを有効にする必要があることに注意してください(「Java 2セキュリティ・マネージャおよびポリシー・ファイルの指定」を参照)。

ユーザーおよびロール・プロパティ・ファイル

OC4J統合機能を使用するには、Javaシステム・プロパティとして表されているユーザー/ロール・プロパティ・ファイルへのパスを、APIフレームワークが認識する必要があります。プロパティ・ファイルには、必要なOC4Jログイン・モジュール情報へアクセスする際にフレームワークが必要とするプロパティが格納されています。このファイルには任意の名前を指定できますが、ファイル形式は次のようにする必要があります。

# This line should not be changed.
configurationsourceclass=oracle.security.idm.util.OC4JConfigurationSource
 
# This property specifies the JMX Mbean URL for the OC4J container in which the 
# application is deployed. 
# For OPMN-managed OC4J, uncomment the URL that follows; comment out all others.
# format: service:jmx:rmi:///opmn://opmnhost[:opmnport]/oc4jInstance

jmxserviceurl=service:jmx:rmi:///opmn://localhost:6008/home

# For standalone OC4J, uncomment the URL that follows; comment out all others.
# format: service:jmx:rmi:///opmn://oc4jhost:rmiport/oc4jContextRoot
#jmxserviceurl=service:jmx:rmi://localhost:23791/oc4j/

関連資料

  • OPMN管理インスタンスまたはスタンドアロンのOC4Jインスタンスに対するJMXサービスURIの設定の詳細は、『Oracle Containers for J2EE開発者ガイド』を参照してください。

 

例: 基本的なユーザーおよびロールAPIフレームワーク

この項では、「手順説明: 基本の使用モデル」で説明した手順に対応する完全な例を示します。

import oracle.security.idm.*;
import oracle.security.idm.providers.oid.*;
import java.util.*;
import java.io.*;
 
public class BasicSampleOID
{
  public static void main(String args[])
  {
    IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder();
    IdentityStoreFactory oidFactory = null;
    IdentityStore oidStore = null;
 
    try
    {
 
      Hashtable factEnv = new Hashtable();
      Hashtable storeEnv = new Hashtable();
 
      // creating the factory instance
      factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_PRINCIPAL,
                  "cn=user,....");
      factEnv.put(OIDIdentityStoreFactory.ST_SECURITY_CREDENTIALS, 
                   "password");
      factEnv.put(OIDIdentityStoreFactory.ST_LDAP_URL,
                  "ldap://johnmc.us.oracle.com:3060/");
      factEnv.put(OIDIdentityStoreFactory.ST_LOGGING,"false");
      factEnv.put(OIDIdentityStoreFactory.ST_LOG_LEVEL,
                  java.util.logging.Level.ALL);
 
      oidFactory =  builder.getIdentityStoreFactory(
                  "oracle.security.idm.providers.oid.OIDIdentityStoreFactory", 
                  factEnv);
      
      // creating the store instance
      storeEnv.put(OIDIdentityStoreFactory.ST_SUBSCRIBER_NAME, 
                   "dc=us,dc=oracle,dc=com");
      oidStore = oidFactory.getIdentityStoreInstance(storeEnv);
 
      // search filter (cn=a*)
      SimpleSearchFilter sf = oidStore.getSimpleSearchFilter(
                    UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null);
      sf.setValue("john"+sf.getWildCardChar());
      
      SearchParameters params = new SearchParameters();
      params.setFilter(sf);
 
      // Searching for users
      SearchResponse resp = oidStore.searchUsers(params);
      System.out.println("Searched users are:");
      while (resp.hasNext())
      {
        User usr = (User) resp.next();
        System.out.println("Name: "+usr.getName());
      }
 
    }catch (IMException e)
    {
      e.printStackTrace();
    }
  }
}

例: OC4J統合を使用するユーザーおよびロールAPIフレームワーク

この項では、「手順説明: OC4J統合の使用モデル」で説明した手順に対応する完全な例を示します。

import java.io.*;
import java.util.*;
import java.security.AccessController;
import java.security.PrivilegedExceptionAction;
import java.security.PrivilegedActionException;
 
// Packages for Servlets
import javax.servlet.*;
import javax.servlet.http.*;
import oracle.security.idm.*;
 
public class UserSearch extends HttpServlet 
{
    private String USERROLEPROPFILE = "UserRolePropFile";
    IdentityStore store = null;
 
    public void init(ServletConfig config) throws ServletException {
        super.init(config);
    }
 
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = "";
        String searchType = "usersearch";
        try 
        {
            name = request.getParameter("name");
            searchType = request.getParameter("searchtype");
        } catch (Exception e) 
        {
            e.printStackTrace();
        }
 
        String filter = (name != null)? name: "";
 
        response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        out.println("<html>");
        out.println("<head><title>UserSearch</title></head>");
        out.println("<body>");
        out.println(
            "<label for=\"fld\"><b>User name begining with</b></label>");
        out.println(
          "<form action=\"usersearch\">"+
          "<P><select name=\"searchtype\" size=\"1\">"+
          "<option value=\"usersearch\">Search Users</option>"+
          "<option value=\"rolesearch\">Search Roles</option>"+
          "<option value=\"membershipsearch\">Search Membership details"+
          "<option value=\"membersearch\">Searchs Members of role"+
          "</option></select></P>"+
          "<input name=\"name\" id=\"fld\" value=\""
          + filter + 
          "\"type=\"text\"/><input type=\"SUBMIT\" value=\"Search\"/></form>");
        out.println("<br><br><br>");
 
        // Create the IdentityStore instance required for searching
        configureAPI(out);
 
        // Carries out the actual search using IdentityStore instance obtained 
        // above
        doSearch(out, searchType, name);
 
        out.println("</body></html>");
        out.close();
    }
 
    public void configureAPI(PrintWriter out) 
    {
      IdentityStoreFactoryBuilder builder = new IdentityStoreFactoryBuilder();
 
      // Set the following system property to specify the location of 
      // "userrole.properties" file. This file is used by user-role apis for 
      // reading the configuration from OC4J
       
      // Get the file location from the servlet init parameters
      System.setProperty("oracle.userrole.properties", 
                 getServletConfig().getInitParameter(USERROLEPROPFILE));
      
      IdentityStoreFactory factory = null;
 
      try
      {
        factory = (IdentityStoreFactory) AccessController.doPrivileged(
                 new PrivilegedExceptionAction()
                 {
                   public Object run() throws IMException
                   {
                     IdentityStoreFactoryBuilder builder = 
                                  new IdentityStoreFactoryBuilder();
                     return builder.getIdentityStoreFactory();
                   }
                 });
        store = factory.getIdentityStoreInstance();
      }catch (PrivilegedActionException e)
      {
        e.getException().printStackTrace(out);
      }
      catch (Exception e) 
      {
        e.printStackTrace(out);
      }
    }
 
    public void doSearch(PrintWriter out, String searchType, String name) 
    {
        System.out.println("Inside doSearch");
 
        if (name == null) return;
        if (searchType.equals("usersearch"))
          searchUsers(out, name);
        else if (searchType.equals("rolesearch"))
          searchRoles(out, name);
        else if (searchType.equals("membershipsearch")) 
          searchMembership(out, name);
        else if (searchType.equals("membersearch")) 
          searchMembers(out, name);
    }
 
    public void searchMembers(PrintWriter out, String name) 
    {
        System.out.println("Inside searchMembers");
        if (name == null) return;
        out.println("Results: <br>");
 
        try {
            Role rle = store.searchRole(IdentityStore.SEARCH_BY_NAME, name);
            out.println("Members of role \""+rle.getName()+
                        "\" are:<br>");
            SearchResponse resp = 
             rle.getRoleProfile().getGrantees(null, false);
            while (resp.hasNext()) {
                Identity idy = resp.next();
                out.println("Unique name: " + idy.getUniqueName() + "<br>");
            }
 
        } catch (IMException e) {
            e.printStackTrace(out);
        }
    }
 
    public void searchMembership(PrintWriter out, String name) 
    {
        System.out.println("Inside searchMembership");
        if (name == null) return;
        out.println("Results: <br>");
 
        try {
            User usr = store.searchUser(name);
            out.println("Membership details for user \""+usr.getName()+
                        "\" are:<br>");
            SearchResponse resp = 
             store.getRoleManager().getGrantedRoles(usr.getPrincipal(), false);
            while (resp.hasNext()) {
                Identity idy = resp.next();
                out.println("Unique name: " + idy.getUniqueName() + "<br>");
            }
 
        } catch (IMException e) {
            e.printStackTrace(out);
        }
    }
 
    public void searchRoles(PrintWriter out, String name) 
    {
        System.out.println("Inside searchRoles");
        if (name == null) return;
        out.println("Results: <br>");
 
        try {
            SimpleSearchFilter sf = store.getSimpleSearchFilter(
                    RoleProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null);
            sf.setValue(name + sf.getWildCardChar());
 
            SearchParameters params = new SearchParameters();
            params.setFilter(sf);
 
            // Searching for users
            SearchResponse resp = store.searchRoles(0, params);
            out.println("Searched roles are:<br>");
            while (resp.hasNext()) {
                Identity idy = resp.next();
                out.println("Unique name: " + idy.getUniqueName() + "<br>");
            }
 
        } catch (IMException e) {
            e.printStackTrace(out);
        }
    }
 
    public void searchUsers(PrintWriter out, String name) 
    {
        System.out.println("Inside searchUsers");
        if (name == null) return;
        out.println("Results: <br>");
 
        try {
            SimpleSearchFilter sf = store.getSimpleSearchFilter(
                    UserProfile.NAME, SimpleSearchFilter.TYPE_EQUAL, null);
            sf.setValue(name + sf.getWildCardChar());
 
            SearchParameters params = new SearchParameters();
            params.setFilter(sf);
 
            // Searching for users
            SearchResponse resp = store.searchUsers(params);
            out.println("Searched users are:<br>");
            while (resp.hasNext()) {
                Identity idy = resp.next();
                out.println("Unique name: " + idy.getUniqueName() + "<br>");
            }
 
        } catch (IMException e) {
            e.printStackTrace(out);
        }
    }
}

戻る 次へ
Oracle
Copyright © 2006 Oracle Corporation.

All Rights Reserved.
目次
目次
索引
索引