Oracle® Fusion Middleware Oracle WebLogic Server WebLogic Webサービスの保護 12c (12.2.1.1.0) E77260-01 |
|
前へ |
次へ |
この章の内容は次のとおりです:
アクセス制御セキュリティとは、アクセスできるユーザーを制御するように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サービスの開発』を参照してください。
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 annotation
の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 Server管理コンソールなどを使用して、外部で行われるものとみなされます。
これらのアノテーションに関するリファレンス情報は、『Oracle 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 + "'"; } }
@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サービスの呼出しに関する項を参照してください。