Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Webサービスの保護 11g リリース1 (10.3.6) B61620-05 |
|
前 |
次 |
この章では、Java API for XML-based RPC (JAX-RPC)を使用してWebLogic Webサービスのアクセス制御セキュリティを構成する方法について説明します。
この章の内容は以下のとおりです。
アクセス制御セキュリティとは、アクセスできるユーザーを制御するようにWebサービスを構成し、クライアントが操作の1つを呼び出したときにWebサービスに対してHTTP/Sまたはユーザー名トークンを使用して自身を認証するようにクライアント・アプリケーションをコーディングすることです。
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サービス・スタート・ガイド』を参照してください。 |
必要に応じて、適切なレベル(クラスまたは操作)で@weblogic.jws.security.RolesAllowed
、@weblogic.jws.security.SecurityRole
、@weblogic.jws.security.RolesReferenced
、@weblogic.jws.security.SecurityRoleRef
の各アノテーションを追加し、JWSファイルを更新します。
「セキュリティ関連アノテーションでのJWSファイルの更新」を参照してください。
必要に応じて@weblogic.jws.security.RunAs
JWSアノテーションを追加することで、WebLogic Serverが実際にWebサービスを呼び出すユーザーに割り当てられているロールではなく、特定のロールを使用してWebサービスを内部で実行することを指定します。
「@RunAsアノテーションでのJWSファイルの更新」を参照してください。
必要に応じて@weblogic.jws.security.UserDataConstraint
JWSアノテーションを追加することで、WebサービスがHTTPSを使用して呼出し可能であること、または呼び出される必要があることを指定します。
詳細は、「UserDataConstraintによるトランスポート・レベルのセキュリティの構成: 主な手順(JAX-RPCのみ)」を参照してください。この項ではまた、SSLを使用するようにクライアント・アプリケーションを更新する方法についても説明しています。
通常の反復的な開発プロセスの一部として、Webサービスを再コンパイルして再デプロイします。
JAX-RPCを使用したWebLogic Webサービス・スタート・ガイドのWebLogic Webサービスの開発に関する項を参照してください。
有効なWebLogic Serverユーザーが存在しない場合には、管理コンソールを使用して作成します。ユーザーのロールへのマッピングが外部で行われている場合は、さらに管理コンソールを使用して@SecurityRole
アノテーションで指定されているロールを作成し、ユーザーをロールにマッピングします。
注意: JWSファイルに@SecurityRoleアノテーションのmapToPrincipals属性を指定して、Webサービスの呼出しが可能なユーザーをすべてリストしないと、ユーザーからロールへのマッピングは外部的に定義されます。 |
『ロールおよびポリシーによるWebLogicリソースの保護』のユーザー、グループおよびセキュリティ・ロールに関する項を参照してください。
HttpTransportInfo
WebLogic APIを使用し、Service
オブジェクトの作成時に適切なユーザーおよびパスワードを指定するよう、クライアント・アプリケーションを更新します。
「サービス・オブジェクト作成時のユーザー名とパスワードの設定」を参照してください。
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>
クライアント側のコンポーネントを再生成して、Javaコードを通常どおりに再コンパイルします。
JWSファイルでWebLogic固有の@weblogic.jws.security.RolesAllowed
アノテーションを使用し、Webサービスの呼出しが許可されているロールをリストする@weblogic.jws.security.SecurityRoles
アノテーションの配列を指定します。これら2つのアノテーションは、クラス・レベルまたはメソッド・レベルのいずれでも指定できます。クラス・レベルで設定した場合、ロールはすべてのパブリック操作に適用されます。このアノテーションをメソッド・レベルで指定することで、特定の操作にロールを追加できます。
@SecurityRole
アノテーションには、次の2つの属性があります。
role
は、Webサービスを呼び出すことができるロールの名前です。
mapToPrincipals
は、ロールにマップするユーザーのリストです。この属性で1人以上のユーザーを指定した場合、ユーザーとロールの間のマッピングを外部で(通常は管理コンソールを使用して)作成する必要はありません。ただし、この属性で指定されたマッピングは、Webサービスのコンテキスト内にのみ適用されます。
@RolesAllowed
アノテーションは、属性を持ちません。
また、@weblogic.jws.security.RolesReferenced
アノテーションを使用して、既存のロールへの参照をリストする@weblogic.jws.security.SecurityRoleRef
アノテーションの配列を指定することもできます。たとえば、ロールmanager
がすでにWebサービスの呼出しを許可されている場合、mgr
ロールからmanager
ロールへのリンクを指定すれば、mgr
にマップされるユーザーもWebサービスを呼び出せるようになります。これら2つのアノテーションは、クラス・レベルのみで指定できます。
@SecurityRoleRef
アノテーションには、次の2つの属性があります。
role
は、ロール参照の名前です。
link
は、Webサービスを呼び出すことができる、すでに指定されたロールの名前です。この属性の値は、同じJWSファイルで指定されている@SecurityRole
アノテーションのrole
属性の値に対応します。
@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 + "'"; } }
この例では、manager
、vp
、およびmgr
ロールのみが、Webサービスの呼出しを許可されることを指定する方法を示しています。mgr
ロールは、実際にはmanager
ロールへの参照です。Webサービスのコンテキスト内で、ユーザーjuliet
およびamanda
はmanager
ロールにマップされます。vp
ロールにマップされるユーザーがないので、WebLogic Serverセキュリティ・レルムを更新するためには、通常管理コンソールを使用して、外部でマッピングが行われることが前提です。
これらのアノテーションに関するリファレンス情報は、『WebLogic Webサービス・リファレンス』の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 + "'"; } }
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; } } }
上記の例で注目すべき主な点は次のとおりです。
クライアント・アプリケーションに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サービスの呼出しに関する一般情報については、JAX-RPCを使用したWebLogic Webサービス・スタート・ガイドのWebサービスの呼出しに関する項を参照してください。