ヘッダーをスキップ
Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Webサービスの保護
12cリリース1(12.1.1)

B65929-01
  ドキュメント・ライブラリへ移動
ライブラリ
製品リストへ移動
製品
目次へ移動
目次

前
 
 

4 アクセス制御セキュリティの構成(JAX-RPCのみ)

この章では、Java API for XML-based RPC(JAX-RPC)を使用してWebLogic Webサービスのアクセス制御セキュリティを構成する方法について説明します。

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

アクセス制御セキュリティの構成: 主な手順

アクセス制御セキュリティとは、アクセスできるユーザーを制御するようにWebサービスを構成し、クライアントが操作の1つを呼び出したときにWebサービスに対してHTTP/Sまたはユーザー名トークンを使用して自身を認証するようにクライアント・アプリケーションをコーディングすることです。

Webサービスのアクセス制御セキュリティを指定するには、JWSファイル内で、次のアノテーションを1つ以上使用します。

次の手順は、これらのアノテーションを使用してアクセス制御セキュリティを有効化するためのステップを大まかに説明したものです。各ステップの詳細は、この章の後半の項で説明します。


注意:

次の手順では、WebLogic Webサービスを実装するJWSファイルがすでに作成されており、そのファイルをアクセス制御セキュリティの設定で更新することを前提としています。

また、Antビルド・スクリプトを使用してWebサービスを反復的に開発することと、新しい情報で更新できる作業用のbuild.xmlファイルがあることも前提となっています。

さらに、保護されていないWebサービスを呼び出すクライアント・アプリケーションも用意されているものとします。これらの前提条件が満たされていない場合は、Oracle WebLogic Server JAX-RPC Webサービス・スタート・ガイドを参照してください。


  1. 必要に応じて、適切なレベル(クラスまたは操作)で@weblogic.jws.security.RolesAllowed@weblogic.jws.security.SecurityRole@weblogic.jws.security.RolesReferenced@weblogic.jws.security.SecurityRoleRefの各アノテーションを追加し、JWSファイルを更新します。

    「セキュリティ関連アノテーションでのJWSファイルの更新」を参照してください。

  2. 必要に応じて@weblogic.jws.security.RunAs JWSアノテーションを追加することで、WebLogic Serverが実際にWebサービスを呼び出すユーザーに割り当てられているロールではなく、特定のロールを使用してWebサービスを内部で実行することを指定します。

    「@RunAsアノテーションでのJWSファイルの更新」を参照してください。

  3. 必要に応じて@weblogic.jws.security.UserDataConstraint JWSアノテーションを追加することで、WebサービスがHTTPSを使用して呼出し可能であること、または呼び出される必要があることを指定します。

    詳細は、「UserDataConstraintによるトランスポート・レベルのセキュリティの構成: 主な手順(JAX-RPCのみ)」を参照してください。この項ではまた、SSLを使用するようにクライアント・アプリケーションを更新する方法についても説明しています。

  4. 通常の反復的な開発プロセスの一部として、Webサービスを再コンパイルして再デプロイします。

    JAX-RPCを使用したWebLogic Webサービス・スタート・ガイドのWebLogic Webサービスの開発に関する項を参照してください。

  5. 有効なWebLogic Serverユーザーが存在しない場合には、管理コンソールを使用して作成します。ユーザーのロールへのマッピングが外部で行われている場合は、さらに管理コンソールを使用して@SecurityRoleアノテーションで指定されているロールを作成し、ユーザーをロールにマッピングします。


    注意:

    JWSファイルに@SecurityRoleアノテーションのmapToPrincipals属性を指定して、Webサービスの呼出しが可能なユーザーをすべてリストしないと、ユーザーからロールへのマッピングは外部的に定義されます。

    ロールおよびポリシーによるWebLogicリソースの保護のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。

  6. HttpTransportInfo WebLogic APIを使用し、Serviceオブジェクトの作成時に適切なユーザーおよびパスワードを指定するよう、クライアント・アプリケーションを更新します。

    「サービス・オブジェクト作成時のユーザー名とパスワードの設定」を参照してください。

  7. build.xmlファイル内のclientgen Antタスクを更新して、有効なWebLogicユーザーのユーザー名およびパスワード(Webサービスで@RolesAllowedアノテーションを使用する場合)と、WebLogic Serverのものも含めて信頼性のある証明書のリストが格納された信頼ストア(@UserDataConstraintを指定する場合)を指定します。

    そのためには、次の例に示すように、ネストされた標準のAnt要素である<sysproperty>clientgen Antタスクに追加し、必要なJavaプロパティにkey属性を設定します。


    注意:

    この例ではユーザー名とパスワードをハード・コードしており、両方の入力を要求することでセキュリティを高めています。SSLを使用する場合は、@RolesAllowedに対するユーザー名とパスワード、および信頼ストアが必要です。

    <clientgen
        wsdl="http://example.com/myapp/myservice.wsdl"
        destDir="/output/clientclasses"
        packageName="myapp.myservice.client"
        serviceName="StockQuoteService" >
        <sysproperty key="javax.net.ssl.trustStore" 
                     value="/keystores/DemoTrust.jks"/> 
        <sysproperty key="weblogic.wsee.client.ssl.stricthostchecking" 
                     value="false"/> 
        <sysproperty key="javax.xml.rpc.security.auth.username" 
                     value="juliet"/> 
        <sysproperty key="javax.xml.rpc.security.auth.password" 
                     value="secret"/> 
    </clientgen>
    
  8. クライアント側のコンポーネントを再生成して、Javaコードを通常どおりに再コンパイルします。

セキュリティ関連アノテーションでのJWSファイルの更新

JWSファイルでWebLogic固有の@weblogic.jws.security.RolesAllowedアノテーションを使用し、Webサービスの呼出しが許可されているロールをリストする@weblogic.jws.security.SecurityRolesアノテーションの配列を指定します。これら2つのアノテーションは、クラス・レベルまたはメソッド・レベルのいずれでも指定できます。クラス・レベルで設定した場合、ロールはすべてのパブリック操作に適用されます。このアノテーションをメソッド・レベルで指定することで、特定の操作にロールを追加できます。

@SecurityRoleアノテーションには、次の2つの属性があります。

@RolesAllowedアノテーションは、属性を持ちません。

また、@weblogic.jws.security.RolesReferencedアノテーションを使用して、既存のロールへの参照をリストする@weblogic.jws.security.SecurityRoleRefアノテーションの配列を指定することもできます。たとえば、ロールmanagerがすでにWebサービスの呼出しを許可されている場合、mgrロールからmanagerロールへのリンクを指定すれば、mgrにマップされるユーザーもWebサービスを呼び出せるようになります。これら2つのアノテーションは、クラス・レベルのみで指定できます。

@SecurityRoleRefアノテーションには、次の2つの属性があります。

@RolesReferencedアノテーションは、属性を持ちません。

次の例では、この項で説明したアノテーションのJWSファイルでの使用方法を示します(該当する個所は太字で示しています)。

package examples.webservices.security_roles;
import javax.jws.WebMethod;
import javax.jws.WebService;
// WebLogic JWS annotations
import weblogic.jws.WLHttpTransport;
import weblogic.jws.security.RolesAllowed; 
import weblogic.jws.security.RolesReferenced; 
import weblogic.jws.security.SecurityRole; 
import weblogic.jws.security.SecurityRoleRef; 
@WebService(name="SecurityRolesPortType",
            serviceName="SecurityRolesService",
            targetNamespace="http://example.org")
@WLHttpTransport(contextPath="security", 
                 serviceUri="SecurityRolesService",
                  portName="SecurityRolesPort")
@RolesAllowed (  { 
    @SecurityRole (role="manager", 
                   mapToPrincipals={ "juliet","amanda" }), 
    @SecurityRole (role="vp") 
} ) 
@RolesReferenced ( 
    @SecurityRoleRef (role="mgr", link="manager") 
) 
/**
 * This JWS file forms the basis of simple Java-class implemented WebLogic
 * Web Service with a single operation: sayHello
 *
 */
public class SecurityRolesImpl {
  @WebMethod()
  public String sayHello(String message) {
    System.out.println("sayHello:" + message);
    return "Here is the message: '" + message + "'";
  }
}

この例では、managervp、およびmgrロールのみが、Webサービスの呼出しを許可されることを指定する方法を示しています。mgrロールは、実際にはmanagerロールへの参照です。Webサービスのコンテキスト内で、ユーザーjulietおよびamandamanagerロールにマップされます。vpロールにマップされるユーザーがないので、WebLogic Serverセキュリティ・レルムを更新するためには、通常管理コンソールを使用して、外部でマッピングが行われることが前提です。

これらのアノテーションに関するリファレンス情報は、WebLogic Webサービス・リファレンスのJWSアノテーション・リファレンスの項を参照してください。

@RunAsアノテーションでのJWSファイルの更新

Webサービスが常に特定のロールとして実行されることを指定するには、JWSファイル内でWebLogic固有の@weblogic.jws.security.RunAsアノテーションを使用します。これはつまり、Webサービスを最初に呼び出すユーザーが誰であろうと、またそのユーザーがどのロールにマップされていようと、サービスは指定されたロールとして内部で実行されるということです。

@RunAsアノテーションは、クラス・レベルでのみ設定できます。このアノテーションには次の属性があります。

次の例では、@RunAsアノテーションのJWSファイルでの使用方法を示します(該当する個所は太字で示しています)。

package examples.webservices.security_roles;
import javax.jws.WebMethod;
import javax.jws.WebService;
// WebLogic JWS annotations
import weblogic.jws.WLHttpTransport;
import weblogic.jws.security.RunAs; 
@WebService(name="SecurityRunAsPortType",
            serviceName="SecurityRunAsService",
            targetNamespace="http://example.org")
@WLHttpTransport(contextPath="security_runas",
                 serviceUri="SecurityRunAsService",
                 portName="SecurityRunAsPort")
@RunAs (role="manager", mapToPrincipal="juliet") 
/**
 * This JWS file forms the basis of simple WebLogic
 * Web Service with a single operation: sayHello
 *
 */
public class SecurityRunAsImpl {
  @WebMethod()
  public String sayHello(String message) {
    System.out.println("sayHello:" + message);
    return "Here is the message: '" + message + "'";
  }
}

サービス・オブジェクト作成時のユーザー名とパスワードの設定

Webサービスの保護に@RolesAllowed JWSアノテーションを使用する場合、指定したロールのみがWebサービス操作の呼出しを許可されます。つまり、保護されているWebサービスを呼び出すクライアント・アプリケーションでServiceオブジェクトを作成する際には、ロールにマップするユーザーのユーザー名およびパスワードを指定する必要があります。

WebLogic Serverでは、ユーザー名およびパスワードを設定してServiceコンストラクタに渡すためのHttpTransportInfoクラスが用意されています。次の例は、スタンドアロンJavaクライアントからWebサービスを呼び出す標準的な方法(JAX-RPCを使用したWebLogic Webサービス・スタート・ガイドWebサービスの呼出しに関する項を参照)に基づいていますが、同時に、HttpTransportInfoクラスを使用してユーザー名およびパスワードを設定する方法も示しています。太字の箇所については、例の後で説明します。

package examples.webservices.sec_wsdl.client;
import weblogic.wsee.connection.transport.http.HttpTransportInfo; 
import java.rmi.RemoteException;
import javax.xml.rpc.ServiceException;
import javax.xml.rpc.Stub;
/**
 * This is a simple standalone client application that invokes the
 * the <code>sayHello</code> operation of the SecWsdlService Web service.
 *
 * @author Copyright © 1996, 2008, Oracle and/or its affiliates. 
 * All rights reserved.
 */
public class Main {
  public static void main(String[] args)
      throws ServiceException, RemoteException{
    HttpTransportInfo info = new HttpTransportInfo(); 
    info.setUsername("juliet".getBytes()); 
    info.setPassword("secret".getBytes()); 
    SecWsdlService service = new SecWsdlService_Impl(args[0] + "?WSDL", info); 
    SecWsdlPortType port = service.getSecWsdlPort();
    try {
      String result = null;
      result = port.sayHello("Hi there!");
      System.out.println( "Got result: " + result );
    } catch (RemoteException e) {
      throw e;
    }
  }
}

上記の例で注目すべき主な点は次のとおりです。

保護されていないWebサービスの呼出しに関する一般情報については、JAX-RPCを使用したWebLogic Webサービス・スタート・ガイドのWebサービスの呼出しに関する項を参照してください。