プライマリ・コンテンツに移動
Oracle® Fusion Middleware Oracle WebLogic Server 12.1.3 RESTful Webサービスの開発と保護
12c (12.1.3)
E57546-02
  目次へ移動
目次

前
 
次
 

6 RESTful Webサービスとクライアントの保護

この章では、Java API for RESTful Web Services (JAX-RS)参照実装(RI)を使用して、Representational State Transfer (REST)アーキテクチャ・スタイルに従ったWebLogic Server 12.1.3内のJava EE Webサービスを保護する方法について説明します。

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

RESTful Webサービス・セキュリティの概要

認証、認可または暗号化をサポートするための次のいずれかのメソッドを使用して、RESTful Webサービスを保護できます。

Oracle JDeveloperを使用したRESTful Webサービス・クライアントの開発の詳細は、『Oracle JDeveloperによるアプリケーションの開発』のRESTful Webサービスおよびクライアントへのポリシーのアタッチ方法に関する項を参照してください。

OWSMポリシーを使用したRESTful Webサービスとクライアントの保護


注意:

OWSMポリシーは、Jersey 1.x JAX-RS RIを使用して構築されたRESTful Webサービスおよびクライアントにのみアタッチできます。Jersey 2.5.1 (JAX-RS 2.0 RI)を使用して構築されたRESTful Webサービスおよびクライアントは、このリリースではOWSMポリシーを使用して保護できません。

RESTful Webサービスでは、OWSMセキュリティ・ポリシーのサブセットのみがサポートされます。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のRESTful WebサービスでサポートされるOWSMポリシーに関する項を参照してください。

OWSMセキュリティ・ポリシーをRESTful Webサービスにアタッチするには、次のいずれかの方法を使用します。

  • 設計時にプログラムを使用してアタッチする。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』の設計時にポリシーをRESTful Webサービスおよびクライアントにアタッチする方法に関する項を参照してください。

  • デプロイメント後に直接およびグローバルにアタッチする。次の方法を使用します。

    • Fusion Middleware Control。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のFusion Middleware Controlを使用してポリシーをアタッチする方法に関する項を参照してください。

    • WLST。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のWLSTを使用してポリシーをアタッチする方法に関する項を参照してください。

例6-1に、WLSTを使用してoracle/http_basic_auth_over_ssl_service_policyポリシーをRESTfulサービスにアタッチする例を示します。詳細は、『Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理』のWLSTを使用してポリシーを直接アタッチする方法に関する項を参照してください。

例6-1 WLSTでOWSMポリシーを使用したRESTful Webサービスの保護

C:\Oracle\Middleware\oracle_common\common\bin> wlst.cmd
...
wls:/offline> connect("weblogic","password","t3://myAdminServer.example.com:7001")
Connecting to t3://myAdminServer.example.com:7001" with userid weblogic ...
Successfully connected to Admin Server "AdminServer" that belongs to domain "my_domain".
 
Warning: An insecure protocol was used to connect to the 
server. To ensure on-the-wire security, the SSL port or 
Admin port should be used instead.
 
wls:/my_domain/serverConfig> beginWSMSession()
Location changed to domainRuntime tree. This is a read-only tree with DomainMBean as the root. 
For more help, use help('domainRuntime')
 
Session started for modification.
wls:/my_domain/serverConfig> selectWSMPolicySubject('weblogic/my_domain/jaxrs_pack', '#jaxrs_pack.war', 'REST-Resource(Jersey)')

The policy subject is selected for modification.

wls:/my_domain/serverConfig> attachWSMPolicy('oracle/http_basic_auth_over_ssl_service_policy')

Policy reference "oracle/http_basic_auth_over_ssl_service_policy" added.

wls:/my_domain/serverConfig> commitWSMSession()

The policy set for subject "/weblogic/my_domain/jaxrs_pack|#jaxrs_pack.war|REST-Resource(Jersey)" was saved successfully.

web.xmlを使用したRESTful Webサービスの保護

web.xmlデプロイメント記述子を他のJava EE Webアプリケーションに対してと同様に使用して、RESTful Webサービスを保護します。詳細は、次を参照してください。

  • 『WebLogicセキュリティ・サービスによるアプリケーションの開発』のセキュアなWebアプリケーションの開発に関する項。

  • Java EE 6チュートリアルのWebアプリケーションの保護に関する項

たとえば、基本認証を使用してRESTful Webサービスを保護するには、次の手順を実行します。

  1. 保護する予定のRESTfulリソース(URI)の各セットについて<security-constraint>を定義します。

  2. <login-config>要素を使用して、使用する認証のタイプとセキュリティ制約が適用されるセキュリティ・レルムを定義します。

  3. <security-roleタグを使用して1つ以上のセキュリティ・ロールを定義し、ステップ1で定義されたセキュリティ制約にマッピングします。詳細は、『WebLogicセキュリティ・サービスによるアプリケーションの開発』のsecurity-roleに関する項を参照してください。

  4. 暗号化を有効にするには、<user-data-constraint要素を追加して<transport-guaranteeサブ要素をCONFIDENTIALに設定します。詳細は、『WebLogicセキュリティ・サービスによるアプリケーションの開発』のuser-data-constraintに関する項を参照してください。

次に、基本認証を使用してJersey 1.18 (JAX-RS 1.1) RESTful Webサービスを保護する方法の例を示します。Jersey 2.5.1 (JAX-RS 2.0) RESTful Webサービスを保護するには、次の例の<servlet-class>要素をorg.glassfish.jersey.servlet.ServletContainerで置き換えます。


注意:

com.sun.jerseyパッケージ、ネストされたパッケージおよびweblogic.jaxrs.api.clientパッケージのサポートは、WebLogic Serverのこのリリースでは非推奨となっています。Jersey 2.5.1 (JAX-RS 2.0 RI)APIを使用するように、RESTfulアプリケーションを早急にアップデートすることをお薦めします。

例6-2 基本認証を使用したRESTful Webサービスの保護

<web-app>
    <servlet>
        <servlet-name>RestServlet</servlet-name>
        <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RestServlet</servlet-name>
        <url-pattern>/*</url-pattern>
    </servlet-mapping>
    <security-constraint>
         <web-resource-collection>
             <web-resource-name>Orders</web-resource-name>
             <url-pattern>/orders</url-pattern>
             <http-method>GET</http-method>
             <http-method>POST</http-method>
         </web-resource-collection>
         <auth-constraint>
             <role-name>admin</role-name> 
         </auth-constraint>
    </security-constraint>
    <login-config>
        <auth-method>BASIC</auth-method>
        <realm-name>default</realm-name>
    </login-config>
    <security-role>
        <role-name>admin</role-name>
    </security-role>
</web-app>

SecurityContextを使用したRESTful Webサービスの保護

javax.ws.rs.core.SecurityContextインタフェースはリクエストのセキュリティ関連情報に対するアクセスを提供します。SecurityContextjavax.servlet.http.HttpServletRequestと同様の機能を提供して、次のセキュリティ関連情報へのアクセスを可能にします。

  • リクエストを作成したユーザーの名前が含まれるjava.security.Principalオブジェクト。

  • リソースの保護に使用される認証タイプ(BASIC_AUTH、FORM_AUTHCLIENT_CERT_AUTHなど)。

  • 認証されたユーザーが特定のロールに含まれているかどうか。

  • リクエストが安全なチャネル(HTTPSなど)を使用して作成されたかどうか。

javax.ws.rs.core.Contextアノテーションを使用してインスタンスをクラス・フィールド、セッター・メソッドまたはメソッド・パラメータに注入することで、SecurityContextにアクセスします。

詳細は、Java EE 6 Platform API仕様で次を参照してください。

例6-3に、@Contextアノテーションを使用してSecurityContextのインスタンスをscメソッド・パラメータに注入し、レスポンスを返す前に、認可されたユーザーがadminロールに含まれているかどうかを確認する方法を示します。

例6-3 SecurityContextを使用したRESTful Webサービスの保護

package samples.helloworld;
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.SecurityContext;
import javax.ws.rs.core.Context;

...

@Path("/stateless")
@Stateless(name = "JaxRSStatelessEJB")
public class StlsEJBApp {
...
        @GET
        @Produces("text/plain;charset=UTF-8")
        @Path("/hello")
        public String sayHello(@Context SecurityContext sc) {
                if (sc.isUserInRole("admin"))  return "Hello World!";
                throw new SecurityException("User is unauthorized.");
        }

Javaセキュリティ・アノテーションを使用したRESTful Webサービスの保護

javax.annotation.securityパッケージにより、RESTful Webサービスの保護に使用できるアノテーション(表6-1で定義)が提供されます。

表6-1 RESTful Webサービスを保護するためのアノテーション

アノテーション 説明

@DenyAll

特定のメソッドがどのセキュリティ・ロールでも呼び出せないことを指定します。

@PermitAll

特定のメソッドがすべてのセキュリティ・ロールで呼び出せることを指定します。

@RolesAllowed

アプリケーション内のメソッドを呼び出すことができるセキュリティ・ロールのリストを指定します。


表6-1で定義されているアノテーションを使用するには、次の各項の説明に従って、roles-allowed機能を登録する必要があります。

  • Jersey 1.18 (JAX-RS 1.1 RI): 『jersey-bundle 1.18 API』Javadocのcom.sun.jersey.api.container.filter.RolesAllowedResourceFilterFactoryクラス。


    注意:

    com.sun.jerseyパッケージ、ネストされたパッケージおよびweblogic.jaxrs.api.clientパッケージのサポートは、WebLogic Serverのこのリリースでは非推奨となっています。Jersey 2.5.1 (JAX-RS 2.0 RI)APIを使用するように、RESTfulアプリケーションを早急にアップデートすることをお薦めします。

  • Jersey 2.5.1 (JAX-RS 2.0 RI): 『Jersey 2.5.1 User Guide』「Securing JAX-RS resources with standard javax.annotation.security annotations」

例6-4に、helloWorldクラスに定義されたメソッドへのアクセスをデフォルトで許可されている、セキュリティ・ロールの定義方法を示します。sayHelloメソッドには、デフォルトをオーバーライドし、ADMINセキュリティ・ロールに属するユーザーのみを許可するために、@RolesAllowsアノテーションが付けられます。

例6-4 Javaセキュリティ・アノテーションを使用したRESTful Webサービスの保護

package samples.helloworld;
 
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.annotation.Security.RolesAllowed;

 
@Path("/helloworld")
@RolesAllowed({"ADMIN", "ORG1"})
public class helloWorld {

   @GET
   @Path("sayHello")  
   @Produces("text/plain")
   @RolesAllows("ADMIN")
   public String sayHello() {
      return "Hello World!";
   }
}

詳細については、以下を参照してください。