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

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

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

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

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

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

  • weblogic.jws.security.RolesAllowed

  • weblogic.jws.security.SecurityRole

  • weblogic.jws.security.RolesReferenced

  • weblogic.jws.security.SecurityRoleRef

  • weblogic.jws.security.RunAs

    ノート:

    @weblogicの.security.jws.SecurityRolesと@weblogic.security.jws.SecurityIdentity JWSアノテーションは、WebLogic Server 9.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ファイルを更新します。
  2. 必要に応じて@weblogic.jws.security.RunAs JWSアノテーションを追加することで、WebLogic Serverが実際にWebサービスを呼び出すユーザーに割り当てられているロールではなく、特定のロールを使用してWebサービスを内部で実行することを指定します。
  3. 必要に応じて@weblogic.jws.security.UserDataConstraint JWSアノテーションを追加することで、WebサービスがHTTPSを使用して呼出し可能であること、または呼び出される必要があることを指定します。

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

  4. 通常の反復的な開発プロセスの一部として、Webサービスを再コンパイルして再デプロイします。
  5. 有効なWebLogic Serverユーザーが存在しない場合には、WebLogic Server管理コンソールを使用して作成します。ユーザーのロールへのマッピングが外部で行われている場合にも、WebLogic Server管理コンソールを使用し、@SecurityRoleアノテーションで指定されているロールを作成して、ユーザーをロールにマッピングします。

    ノート:

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

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

  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つの属性があります。

  • roleは、Webサービスを呼び出すことができるロールの名前です。

  • mapToPrincipalsは、ロールにマップするユーザーのリストです。この属性で1人以上のユーザーを指定した場合、ユーザーとロールの間のマッピングを外部で(通常はWebLogic Server管理コンソールを使用して)作成する必要はありません。ただし、この属性で指定されたマッピングは、Webサービスのコンテキスト内にのみ適用されます。

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

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

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

  • roleは、ロール参照の名前です。

  • linkは、Webサービスを呼び出すことができる、すでに指定されたロールの名前です。この属性の値は、同じJWSファイルで指定されている@SecurityRole annotationrole属性の値に対応します。

@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 Server管理コンソールなどを使用して、外部で行われるものとみなされます。

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

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

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

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

  • roleは、Webサービスを実行する際のロールです。

  • mapToPrincipalは、ロールにマップするプリンシパル・ユーザーです。

次の例では、@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 + "'";
  }
}

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

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

WebLogic Serverでは、ユーザー名およびパスワードを設定してServiceコンストラクタに渡すためのHttpTransportInfoクラスが用意されています。次の例は、スタンドアロンJavaクライアントからWebサービスを呼び出す標準的な方法(『Oracle WebLogic Server JAX-RPC 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;
    }
  }
}

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

  • クライアント・アプリケーションにHttpTransportInfoクラスをインポートします。

    import weblogic.wsee.connection.transport.http.HttpTransportInfo;
  • HttpTransportInfoクラスのsetXXX()メソッドを使用して、ユーザー名およびパスワードを設定します。

    HttpTransportInfo info = new HttpTransportInfo();
    info.setUsername("juliet".getBytes());
    info.setPassword("secret".getBytes());
    

    この例では、パスワードがsecretであるユーザーjulietが、有効なWebLogic Serverユーザーであり、Webサービスの@RolesAllowed JWSアノテーションで指定されたロールにマップ済であることを前提としています。

    プロキシを使用してWebサービスにアクセスしている場合、Javaコードは次のようになります。

    HttpTransportInfo info = new HttpTransportInfo();
    Proxy p = new Proxy(Proxy.Type.HTTP, new  InetSocketAddress(proxyHost, Integer.parseInt(proxyPort)));
    info.setProxy(p);
    info.setProxyUsername(user.getBytes());
    info.setProxyPassword(pass.getBytes());
    
  • 標準的なWSDLの1番目の引数に加えて、ユーザー名およびパスワードが含まれているinfoオブジェクトを2番目の引数としてServiceコンストラクタに渡します。

    SecWsdlService service = new SecWsdlService_Impl(args[0] + "?WSDL", info);
    

保護されていないWebサービスの呼出しに関する一般的な情報は、Oracle WebLogic Server JAX-RPC Webサービスの開発Webサービスの呼出しを参照してください。