5 RESTful Webサービスとクライアントの保護
Oracle WebLogic Serverは、Java API for RESTful Web Services (JAX-RS)参照実装(RI)を使用して、Representational State Transfer (REST)アーキテクチャ・スタイルに従ったJava EE Webサービスを保護する方法を完全にサポートしています。
RESTful Webサービス・セキュリティについて
-
Oracle Web Services Manager (OWSM)ポリシーのアタッチ。「OWSMポリシーを使用したRESTful Webサービスとクライアントの保護」を参照してください。
-
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ポリシーを使用したRESTful Webサービスとクライアントの保護
OWSMセキュリティ・ポリシーをRESTful Webサービスにアタッチするには、次のいずれかの方法を使用します。
-
設計時にプログラムを使用して行う。詳細は、Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理の設計時にポリシーをRESTful Webサービスおよびクライアントにアタッチする方法を参照してください。
-
デプロイメント後に直接およびグローバルにアタッチする。次の方法を使用します。
-
Fusion Middleware Control。詳細は、Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理で、Fusion Middleware Controlを使用してWebサービスおよびクライアントにポリシーをアタッチする方法についてを参照してください。
-
WLST。詳細は、Oracle Web Services ManagerによるWebサービスの保護とポリシーの管理で、WLSTを使用したWebサービスおよびクライアントへのポリシーのアタッチについてを参照してください。
-
例5-1は、WLSTを使用してoracle/http_basic_auth_over_ssl_service_policyポリシーをRESTfulサービスにアタッチする例を示していますOracle Web Services ManagerによるWebサービスの保護とポリシーの管理のWLSTを使用してポリシーを直接アタッチする方法に関する項を参照してください。
例5-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 7チュートリアルの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に関する項を参照してください。
例5-2 基本認証を使用したRESTful Webサービスの保護
次の例では、基本認証を使用してJersey 2.x (JAX-RS 2.0) RESTful Webサービスを保護する方法を示します。
<web-app>
<servlet>
<servlet-name>RestServlet</servlet-name><servlet-class>org.glassfish.jersey.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インタフェースはリクエストのセキュリティ関連情報に対するアクセスを提供します。 SecurityContextはjavax.servlet.http.HttpServletRequestと同様の機能を提供して、次のセキュリティ関連情報へのアクセスを可能にします。
-
リクエストを作成したユーザーの名前が含まれる
java.security.Principalオブジェクト。 -
リソースの保護に使用される認証タイプ(
BASIC_AUTH、FORM_AUTH、CLIENT_CERT_AUTHなど)。 -
認証されたユーザーが特定のロールに含まれているかどうか。
-
リクエストが安全なチャネル(HTTPSなど)を使用して作成されたかどうか。
javax.ws.rs.core.Contextアノテーションを使用してインスタンスをクラス・フィールド、セッター・メソッドまたはメソッド・パラメータに注入することで、SecurityContextにアクセスします。
詳細は、Java EE 7 API仕様の次の項を参照してください。
-
SecurityContextインタフェース -
@Contextアノテーション
例5-3に、@Contextアノテーションを使用してSecurityContextのインスタンスをscメソッド・パラメータに注入し、レスポンスを返す前に、認可されたユーザーがadminロールに含まれているかどうかを確認する方法を示します。
例5-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サービスの保護に使用できる各種アノテーションが提供されます。これらのアノテーションは、表5-1に定義されています。
表5-1 RESTful Webサービスを保護するためのアノテーション
| アノテーション | 説明 |
|---|---|
|
|
特定のメソッドがどのセキュリティ・ロールでも呼び出せないことを指定します。 |
|
|
特定のメソッドがすべてのセキュリティ・ロールで呼び出せることを指定します。 |
|
|
アプリケーション内のメソッドを呼び出すことができるセキュリティ・ロールのリストを指定します。 |
表5-1で定義されているアノテーションを使用する前に、Jersey 2.22 User Guideの標準のjavax.annotation.securityアノテーションによるJAX-RSリソースの保護に関する項で説明されているように、ロールで許可される機能を登録する必要があります。
例5-4に、helloWorldクラスに定義されたメソッドへのアクセスをデフォルトで許可されている、セキュリティ・ロールの定義方法を示します。sayHelloメソッドには、デフォルトをオーバーライドし、ADMINセキュリティ・ロールに属するユーザーのみを許可するために、@RolesAllowsアノテーションが付けられます。
例5-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 7 TutorialのSpecifying Authorized Users by Declaring Security Roles