Oracle® Fusion Middleware Oracle WebLogic Server 12.1.3 RESTful Webサービスの開発と保護 12c (12.1.3) E57546-02 |
|
前 |
次 |
この章では、Java API for RESTful Web Services (JAX-RS)参照実装(RI)を使用して、Representational State Transfer (REST)アーキテクチャ・スタイルに従ったWebLogic Server 12.1.3内のJava EE Webサービスを保護する方法について説明します。
この章の内容は次のとおりです:
認証、認可または暗号化をサポートするための次のいずれかのメソッドを使用して、RESTful Webサービスを保護できます。
Oracle Web Services Manager (OWSM)ポリシーのアタッチ。「OWSMポリシーを使用したRESTful Webサービスとクライアントの保護」を参照してください。
注意: この項は、Jersey 1.x JAX-RS RIを使用して構築されたRESTful Webサービスおよびクライアントにのみ適用されます。Jersey 2.5.1 (JAX-RS 2.0 RI)を使用して構築されたRESTful Webサービスおよびクライアントは、このリリースではOWSMポリシーを使用して保護できません。
web.xml
デプロイメント記述子の更新による、認証されたユーザーに関する情報へのアクセス。「web.xmlを使用したRESTful Webサービスの保護」を参照してください。
javax.ws.rs.core.SecurityContext
インタフェースを使用した、リクエストのセキュリティ関連情報へのアクセス。「SecurityContextを使用したRESTful Webサービスの保護」を参照してください。
JAX-RSクラスへのアノテーションの適用。「Javaセキュリティ・アノテーションを使用したRESTful Webサービスの保護」を参照してください。
Oracle JDeveloperを使用したRESTful Webサービス・クライアントの開発の詳細は、『Oracle JDeveloperによるアプリケーションの開発』の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
デプロイメント記述子を他のJava EE Webアプリケーションに対してと同様に使用して、RESTful Webサービスを保護します。詳細は、次を参照してください。
『WebLogicセキュリティ・サービスによるアプリケーションの開発』のセキュアなWebアプリケーションの開発に関する項。
Java EE 6チュートリアルのWebアプリケーションの保護に関する項
たとえば、基本認証を使用してRESTful Webサービスを保護するには、次の手順を実行します。
保護する予定のRESTfulリソース(URI)の各セットについて<security-constraint>
を定義します。
<login-config>
要素を使用して、使用する認証のタイプとセキュリティ制約が適用されるセキュリティ・レルムを定義します。
<security-role
タグを使用して1つ以上のセキュリティ・ロールを定義し、ステップ1で定義されたセキュリティ制約にマッピングします。詳細は、『WebLogicセキュリティ・サービスによるアプリケーションの開発』のsecurity-roleに関する項を参照してください。
暗号化を有効にするには、<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>
javax.ws.rs.core.SecurityContext
インタフェースはリクエストのセキュリティ関連情報に対するアクセスを提供します。SecurityContext
はjavax.servlet.http.HttpServletRequest
と同様の機能を提供して、次のセキュリティ関連情報へのアクセスを可能にします。
リクエストを作成したユーザーの名前が含まれるjava.security.Principal
オブジェクト。
リソースの保護に使用される認証タイプ(BASIC_AUTH、FORM_AUTH
、CLIENT_CERT_AUTH
など)。
認証されたユーザーが特定のロールに含まれているかどうか。
リクエストが安全なチャネル(HTTPSなど)を使用して作成されたかどうか。
javax.ws.rs.core.Context
アノテーションを使用してインスタンスをクラス・フィールド、セッター・メソッドまたはメソッド・パラメータに注入することで、SecurityContext
にアクセスします。
詳細は、Java EE 6 Platform API仕様で次を参照してください。
SecurityContext
インタフェース
@Context
アノテーション
例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."); }
javax.annotation.security
パッケージにより、RESTful Webサービスの保護に使用できるアノテーション(表6-1で定義)が提供されます。
表6-1 RESTful Webサービスを保護するためのアノテーション
アノテーション | 説明 |
---|---|
|
特定のメソッドがどのセキュリティ・ロールでも呼び出せないことを指定します。 |
|
特定のメソッドがすべてのセキュリティ・ロールで呼び出せることを指定します。 |
|
アプリケーション内のメソッドを呼び出すことができるセキュリティ・ロールのリストを指定します。 |
表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!"; } }
詳細については、以下を参照してください。
『The Java EE Tutorial』の「Specifying Authorized Users by Declaring Security Roles」。