2.15. JAX-RS Web サービスのセキュア化
RESTEasy は JAX-RS メソッドでの @RolesAllowed、@PermitAll、@DenyAll アノテーションに対応しています。ただし、これらのアノテーションを認識させるには、ロールベースのセキュリティーを有効にする必要があります。
2.15.1. ロールベースのセキュリティーの有効化
以下の手順に従って、web.xml ファイルを設定し、ロールベースのセキュリティーを有効にします。
アプリケーションが EJB を使用する場合は、ロールベースのセキュリティーをアクティベートしないでください。EJB コンテナーは RESTEasy ではなく機能を提供します。
RESTEasy JAX-RS Web サービスのロールベースのセキュリティーの有効化
-
テキストエディターでアプリケーションの
web.xmlファイルを開きます。 以下の
<context-param>をファイルに、<web-app>内に追加します。<context-param> <param-name>resteasy.role.based.security</param-name> <param-value>true</param-value> </context-param>
<security-role>タグを使用して、RESTEasy JAX-RS WAR ファイル内で使用されるすべてのロールを宣言します。<security-role> <role-name>ROLE_NAME</role-name> </security-role> <security-role> <role-name>ROLE_NAME</role-name> </security-role>
すべてのロールについて JAX-RS ランタイムによって処理されるすべての URL へのアクセスを承認します。
<security-constraint> <web-resource-collection> <web-resource-name>Resteasy</web-resource-name> <url-pattern>/PATH</url-pattern> </web-resource-collection> <auth-constraint> <role-name>ROLE_NAME</role-name> <role-name>ROLE_NAME</role-name> </auth-constraint> </security-constraint>このアプリケーションの適切なログイン設定を定義します。
<login-config> <auth-method>BASIC</auth-method> <realm-name>jaxrs</realm-name> </login-config>
ロールベースのセキュリティーは、定義されたロールとともにアプリケーション内で有効にされています。
例: ロールベースのセキュリティー設定
<web-app>
<context-param>
<param-name>resteasy.role.based.security</param-name>
<param-value>true</param-value>
</context-param>
<security-constraint>
<web-resource-collection>
<web-resource-name>Resteasy</web-resource-name>
<url-pattern>/security</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
<role-name>user</role-name>
</auth-constraint>
</security-constraint>
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>jaxrs</realm-name>
</login-config>
<security-role>
<role-name>admin</role-name>
</security-role>
<security-role>
<role-name>user</role-name>
</security-role>
</web-app>
2.15.2. アノテーションを使用した JAX-RS Web サービスのセキュア化
アノテーションを使用して JAX-RS Web サービスを保護するには、以下の手順を行います。
- ロールベースのセキュリティーを有効化します。
JAX-RS Web サービスにセキュリティーアノテーションを追加します。RESTEasy は以下のアノテーションをサポートします。
@RolesAllowed-
メソッドにアクセスできるロールを定義します。すべてのロールは
web.xml ファイルで定義する必要があります。 @PermitAll-
web.xmlファイルに定義されているすべてのロールがメソッドにアクセスできるようにします。 @DenyAll- メソッドへのすべてのアクセスを拒否します。
以下の例は、@RolesAllowed アノテーションを使用して admin ロールが Web サービスにアクセスできることを指定します。
@RolesAllowed("admin")
@Path("/test")
public class TestService {
...
}2.15.3. プログラムによるセキュリティーの設定
JAX-RS には、セキュアな要求のセキュリティー情報を収集するためのプログラム API が含まれています。javax.ws.rs.core.SecurityContext インターフェイスには、セキュアな HTTP 呼び出しを行うユーザーのアイデンティティーを判断するメソッドがあります。また、現在のユーザーが特定のロールに属するかどうかをチェックすることができるメソッドもあります。
public interface SecurityContext {
public Principal getUserPrincipal();
public boolean isUserInRole(String role);
public boolean isSecure();
public String getAuthenticationScheme();
}
SecurityContext インスタンスにアクセスするには、@Context アノテーションを使用して、フィールド、セッターメソッド、またはリソースメソッドパラメーターにインジェクトします。
@Path("test")
public class SecurityContextResource {
@Context
SecurityContext securityContext;
@GET
@Produces("text/plain")
public String get() {
if (!securityContext.isUserInRole("admin")) {
throw new WebApplicationException(Response.serverError().status(HttpResponseCodes.SC_UNAUTHORIZED)
.entity("User " + securityContext.getUserPrincipal().getName() + " is not authorized").build());
}
return "Good user " + securityContext.getUserPrincipal().getName();
}
}