|
この章では、Web サービス セキュリティをコンフィグレーションする方法について説明します。
アクセス制御セキュリティとは、アクセスできるユーザを制御するように Web サービスをコンフィグレーションし、クライアントがオペレーションの 1 つを呼び出したときに Web サービスに対して HTTP/S またはユーザ名トークンを使用して自身を認証するようにクライアント アプリケーションをコーディングすることです。
Web サービスのアクセス制御セキュリティを指定するには、JWS ファイル内で、以下のアノテーションを 1 つ以上、使用します。
| 注意 : | @weblogic.security.jws.SecurityRoles および @weblogic.security.jws.SecurityIdentity JWS アノテーションは、WebLogic Server 9.1 から非推奨になりました。 |
以下では、これらのアノテーションを使用してアクセス制御セキュリティを有効化する高度な手順について説明します。手順の詳細についてはこの章の後の節で説明します。
| 注意 : | 次の手順では、WebLogic Web サービスを実装する JWS ファイルがすでに作成されていることを前提として、そのファイルをアクセス制御セキュリティの設定で更新します。また、Ant ビルド スクリプトを使用して Web サービスを反復的に開発することと、新しい情報で更新できる作業用の build.xml ファイルがあることも前提となっています。さらに、保護されていない 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 を使用するようにクライアント アプリケーションを更新する方法についても説明します。
『JAX-RPC を使用した WebLogic Web サービスの開始』の「WebLogic Web サービスの開発」を参照してください。
@SecurityRole アノテーションで指定されているロールを作成し、ユーザをロールにマッピングします。| 注意 : | Web サービスを呼び出せるすべてのユーザがリストされるように、JWS ファイルで @SecurityRole アノテーションの mapToPrincipals 属性を指定していない場合、ユーザのロールへのマッピングは外部で定義されます。 |
詳細については、『ロールおよびポリシーによる WebLogic リソースの保護』の「ユーザ、グループ、セキュリティ ロール」を参照してください。
HttpTransportInfo WebLogic API を使用し、Service オブジェクトの作成時に適切なユーザおよびパスワードを指定するよう、クライアント アプリケーションを更新します。
「サービス オブジェクト作成時のユーザ名とパスワードの設定」を参照してください。
build.xml ファイル内の clientgen Ant タスクを更新して、有効な WebLogic ユーザのユーザ名およびパスワード (Web サービスで @RolesAllowed アノテーションを使用する場合)、および WebLogic Server のものを含む信頼性のある証明書のリストが格納されたトラストストア (@UserDataConstraint を指定する場合) を指定します。
これは以下のサンプルに示すように、clientgen Ant タスクに標準の Ant のネストされた要素である <sysproperty> を追加して、必要な Java プロパティに key 属性を設定することで指定できます。
| 注意 : | このサンプルではユーザ名とパスワードをハードコード化しており、両者を要求することでセキュリティを高めています。SSL を使用する必要がある場合は、@RolesAllowed のユーザ名とパスワード、および trustStore が必要になります。 |
<clientgen
wsdl="http://example.com/myapp/myservice.wsdl"
destDir="/output/clientclasses"
packageName="myapp.myservice.client"
serviceName="StockQuoteService" ><sysproperty key="javax.net.ssl.trustStore"</clientgen>
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"/>
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 アノテーション
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")
)/**
* この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な
* Java クラス実装の WebLogic Web サービスの基本となる
*
*/
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 セキュリティ レルムを更新するためには、通常 Administration Console を使用して、外部でマッピングが行われることが前提です。
これらのアノテーションのリファレンス情報については、『WebLogic Web サービス リファレンス』の「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 アノテーション
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")/**
* この JWS ファイルは、1 つのオペレーション sayHello を含む簡単な
* WebLogic Web サービスの基本となる
*
*/
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;
/**
* SecWsdlService Web サービスの <code>sayHello</code> オペレーションを呼び出す
* 簡単なスタンドアロンのクライアント アプリケーション
*
* @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());
info オブジェクトを 2 番目の引数として Service コンストラクタに渡す。SecWsdlService service = new SecWsdlService_Impl(args[0] + "?WSDL", info);
保護されていない Web サービスの呼び出しに関する一般情報については、『JAX-RPC を使用した WebLogic Web サービスの開始』の「Web サービスの呼び出し」を参照してください。
|